В Perl как посмотреть каталог на предмет изменений?
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.
Можете ли вы сказать мне, почему статистика отсутствует и как это исправить?
2 ответа
Обратите внимание, что я отвечаю на ваш оригинальный вопрос, почему stat()
Казалось, что провал, а не недавно отредактированный заголовок вопроса, который просит что-то другое
Это исправление:
my $data_file= `ls -t $data_dir | head -1`;
chomp($data_file);
Причина, по которой это исправление, немного мутная. Без этого chomp()
, $data_file
содержит завершающий символ новой строки: "some_filename\n"
, Форма с двумя аргументами open()
игнорирует завершающие символы новой строки в именах файлов, и я не знаю почему, потому что открытое с двумя аргументами имитирует поведение оболочки. Ваш звонок в stat()
однако не игнорирует символ новой строки в имени файла, поэтому stat()
несуществующий файл и, таким образом, $stats1
является undef
,
Реальное исправление - это 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) {
# ...
}