2012-06-28 4 views
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, как я могу посмотреть каталог изменений?

$ 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. 

Можете ли вы сказать мне, почему статистика не хватает и как это исправить?

+5

Я не верю, что это код, который вы на самом деле бежали. $ data_file будет содержать имя файла, за которым следует новая строка, поэтому open будет терпеть неудачу, поэтому он умрет. «Chomp» исправит это. Есть много других проблем, но в чем смысл комментировать что-то, что не является вашим кодом? Я настоятельно рекомендую вам начать с добавления 'use strict; использовать предупреждения "и исправить эти ошибки. – ikegami

+0

у него есть файл, как вы видите, он напечатан в первой строке как «archive/oswiostat/oracleapps.localdomain_iostat_12.06.28.1500.dat» – VeerM

+0

Нет, у него есть '' archive/oswiostat/oracleapps.localdomain_iostat_12.06.28.1500.dat \ n "' – ikegami

ответ

2

Обратите внимание, что я отвечаю на ваш оригинальный вопрос, почему stat(), похоже, терпел неудачу, а не только что редактировал заголовок вопроса, который задает что-то другое.

Это исправление:

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

причина это исправление немного мутный. Без этого chomp(), $data_file содержит завершающую строку новой строки: "some_filename\n". Два аргумента формы open()ignores trailing newlines in filenames and I don't know why , потому что two-arg open имитирует поведение оболочки. Однако ваш вызов stat() не игнорирует символ новой строки в имени файла, поэтому он содержит stat() и несуществующий файл, и поэтому $stats1 - undef.

+0

@picrow thans for help. Я трогаю perl через долгое время, спасибо за быструю помощь. И мне нужно исправить $ stats2, который находится в цикле if. Эта переменная должна быть глобальной, как я должен ее исправить. На данный момент stats2 показывает пустой. – VeerM

13

Настоящее исправление: 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) { 
    # ... 
} 
+0

+1 Для решения проблемы [XY] (http://www.perlmonks.org/?node_id=542341) – pilcrow

+1

+1: Синан: Мне нужна эта функциональность, и я думаю, что ваш пост помогает мне. –

 Смежные вопросы

  • Нет связанных вопросов^_^