CGI-BBS > CGI > Perl > Perlの改造で複数のログファイルを検索したい。


カレッヂ
カレッヂ


質問者 バカボン  投稿日 2004/5/4(火) 15:53:45
現在ログファイルuser.cgi user2.cgi user3.cgi user4.cgi とありますが
検索して該当するデータ表示させたいのですが、これらのログファイルを1つにして
検索させるためのソースが上手くできません・・・
下記のソースでおかしいところを指摘していただけないでしょうか?
※FileOpen〜FileOpen4のサブルーチンは設定済みです
----------以下が該当する検索部分のソースです

################
#   FileOpen   #
################
sub FileOpen{ my($handle,$file,$name)=@_;
if(!open($handle,$file)){
    ($name eq '') and $name=(split/\//,$file)[-1];
    &Error("$nameが開けません。");
}}
-------------------------------------------------------------------
if($FORM{Tfile} eq 'Data' and $CNF{Check}{UdataSearch}){
    &FileOpen('FILE',"$UserDir/user.cgi");
        &FileOpen2('FILE',"$UserDir/user2.cgi");
            &FileOpen3('FILE',"$UserDir/user3.cgi");
                &FileOpen4('FILE',"$UserDir/user4.cgi");
                (FILE) = (&FileOpen,&FileOpen2,&FileOpen3,&FileOpen4); 
    while(<FILE>){
        my@tmp=split(/<>/,$_);
        @{$USER{$tmp[$REC{User}{UserNum}]}}=@tmp;
    }close(FILE);
}my$char='(?:[\x00-\x7F\xA1-\xDF]|[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])';
my$file=($FORM{Tfile} eq 'User')?"$UserDir/user.cgi":"$DataDir/data/data.cgi";
my$file=($FORM{Tfile} eq 'User')?"$UserDir/user2.cgi":"$DataDir/data/data.cgi";
my$file=($FORM{Tfile} eq 'User')?"$UserDir/user3.cgi":"$DataDir/data/data.cgi";
my$file=($FORM{Tfile} eq 'User')?"$UserDir/user4.cgi":"$DataDir/data/data.cgi";
&FileOpen('SEARCH',$file);
while(<SEARCH>){ $found=1;
    ($FORM{SearchMax} and @HitNums>=$FORM{SearchMax}) and last;

プロバイダ参照:
サーバのOS:UNIXサーバ
パソコンのOS:WinNT系
エディタ:perlediter
FTPソフト:ffftp
サーバ移転:していない
改造:している 改造前正常動作
CGI習熟度:advanced

回答者 しあわせのツボ  [削除]  投稿日 2004/5/6(木) 14:22:30
同じファイルハンドル名で複数のファイルを同時に開こうとしているように見受けます。
同じ名前で同時に開けるファイルは1つで、
新しいファイルを開くと前のファイルは自動的にcloseされます。

foreach $i ('',2,3,4) {
if(open(FILE,"user$i?.cgi") { &Error("ファイルが開けません。"); }
foreach(<FILE>) { @{$USER{$tmp[$REC{User}{UserNum}]}}=split(/<>/,$_); }
close(FILE);
}
これで、@{$USER{$tmp[$REC{User}{UserNum}]}}に4ファイル全てのデータが入ります。
こんなんで参考になりますでしょうか。
質問者 バカボン  [削除]  投稿日 2004/5/6(木) 15:45:26
さっそくお答え頂きましてありがとうございます。
そこで実際に書いて頂いたソースは
下記のソースの中で該当する範囲はどこからどこになるのでしょうか?
それとも下記のソース全てでしょうか?
FileOpenのサブルーチンはそのままでよろしいのでしょうか?

if($FORM{Tfile} eq 'Data' and $CNF{Check}{UdataSearch}){
    &FileOpen('FILE',"$UserDir/user.cgi");
        &FileOpen2('FILE',"$UserDir/user2.cgi");
            &FileOpen3('FILE',"$UserDir/user3.cgi");
                &FileOpen4('FILE',"$UserDir/user4.cgi");
                (FILE) = (&FileOpen,&FileOpen2,&FileOpen3,&FileOpen4); 
    while(<FILE>){
        my@tmp=split(/<>/,$_);
        @{$USER{$tmp[$REC{User}{UserNum}]}}=@tmp;
    }close(FILE);
}my$char='(?:[\x00-\x7F\xA1-\xDF]|[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])';
my$file=($FORM{Tfile} eq 'User')?"$UserDir/user.cgi":"$DataDir/data/data.cgi";
my$file=($FORM{Tfile} eq 'User')?"$UserDir/user2.cgi":"$DataDir/data/data.cgi";
my$file=($FORM{Tfile} eq 'User')?"$UserDir/user3.cgi":"$DataDir/data/data.cgi";
my$file=($FORM{Tfile} eq 'User')?"$UserDir/user4.cgi":"$DataDir/data/data.cgi";
&FileOpen('SEARCH',$file);
while(<SEARCH>){ $found=1;
    ($FORM{SearchMax} and @HitNums>=$FORM{SearchMax}) and last;

このページは終了したので返信(回答)は書きこめません
 


Web裏技