1
use Text::Diff;
for($count = 0; $count <= 1000; $count++){
   my $data_dir="archive/oswiostat/oracleapps.*dat";
   my $data_file= `ls -t $data_dir | head -1`;
   while($data_file){
      print $data_file;
      open (DAT,$data_file) || die("Could not open file! $!");
      $stats1 = (stat $data_file)[9];
      print "Stats: \n";
      @raw_data=<DAT>;
      close(DAT);
      print "Stats1 is :$stats1\n";
      sleep(5);
      if($stats1 != $stats2){
         @diff = diff \@raw_data, $data_file, { STYLE => "Context" };
         $stats2 = $stats1;
      }
      print @diff || die ("Didn't see any updates $!");
   }
}

出力:

$ perl client_socket.pl
archive/oswiostat/oracleapps.localdomain_iostat_12.06.28.1500.dat
Stats:
Stats1 is :
Didn't see any updates  at client_socket.pl line 18.

統計が欠落している理由とその修正方法を教えてください。

4

2 に答える 2

14

実際の修正は、File::ChangeNotifyまたはFile::Monitorまたは同様のものです(たとえば、WindowsではWin32 :: ChangeNotify)。

use File::ChangeNotify;

my $watcher = File::ChangeNotify->instantiate_watcher(
    directories => [ 'archive/oswiostat' ],
    filter => qr/\Aoracleapps[.].*dat\z/,
);

while (my @events = $watcher->wait_for_events) {
    # ...
}
于 2012-06-28T20:21:29.287 に答える
2

stat()新しく編集された質問のタイトルではなく、なぜ失敗したように見えるのか、元の質問に答えていることに注意してください。

これは修正です:

my $data_file= `ls -t $data_dir | head -1`;
chomp($data_file);

これが修正である理由は少し曖昧です。それがないとchomp()$data_file末尾の改行が含まれます: "some_filename\n"。の2つの引数形式は、ファイル名の末尾の改行をopen() 無視します。2つの引数のopenはシェルの動作を模倣しているため、理由はわかりません。ただし、への呼び出しstat()はファイル名の改行を無視しないため、stat()存在しないファイルを使用しているため、$stats1ですundef

于 2012-06-28T19:59:04.077 に答える