在Perl中,如何监视目录的更改?

在Perl中,如何监视目录的更改?,perl,filesystems,change-notification,Perl,Filesystems,Change Notification,你能告诉我统计数据丢失的原因以及如何修复吗?请注意,我是在回答你最初的问题,为什么stat()似乎失败了,而不是新编辑的问题标题,它询问了一些不同的问题 这是修复方法: $ 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. 修复

你能告诉我统计数据丢失的原因以及如何修复吗?

请注意,我是在回答你最初的问题,为什么
stat()
似乎失败了,而不是新编辑的问题标题,它询问了一些不同的问题

这是修复方法:

$ 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.
修复的原因有点模糊。如果没有这个
chomp()
$data\u file
包含一个尾随换行符:
“some\u filename\n”
open()
的双参数形式,因为两个arg-open模仿shell行为。但是,您对
stat()
的调用并没有忽略文件名中的换行符,因此它是
stat()
调用一个不存在的文件,因此
$stats1
undef

注意,我在回答您最初的问题,为什么
stat()
似乎失败了,而不是新编辑的问题标题,这要求一些不同的东西

这是修复方法:

$ 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.
修复的原因有点模糊。如果没有这个
chomp()
$data\u file
包含一个尾随换行符:
“some\u filename\n”
open()
的双参数形式,因为两个arg-open模仿shell行为。但是,您对
stat()
的调用不会忽略文件名中的换行符,因此它是
stat()
调用一个不存在的文件,因此
$stats1
undef

真正的修复是或类似的(例如,在Windows上)

真正的修复是或类似的(例如,在Windows上)


我不相信这是你实际运行的代码$data_文件将包含文件名,后跟一个换行符,因此open将失败,因此它将死亡。一个
chomp
可以解决这个问题。还有很多其他的问题,但是对不是你的代码的东西发表评论有什么意义呢?我强烈建议您从添加
使用strict开始;使用警告并修复这些错误。它有一个文件,正如您看到的,它在第一行打印为“archive/oswiostat/oracleapps.localdomain\u iostat\u 12.06.28.1500.dat”不,它有
“archive/oswiostat/oracleapps.localdomain\u iostat\u 12.06.28.1500.dat”
@ikegami,它是实际的代码。在我的Linux系统上,根据strace的说法,
open(F,“newline\n”)
调用
open(“newline”*[sic]*,…)
,但是
stat“newline\n”
调用
stat(“newline\n”*[sic]*,…)
。你说得对,这是新线的麻烦。三个arg open似乎保留了换行符FWIW。那么修复方法是什么呢?我不相信这是您实际运行的代码$data_文件将包含文件名,后跟一个换行符,因此open将失败,因此它将死亡。一个
chomp
可以解决这个问题。还有很多其他的问题,但是对不是你的代码的东西发表评论有什么意义呢?我强烈建议您从添加
使用strict开始;使用警告并修复这些错误。它有一个文件,正如您看到的,它在第一行打印为“archive/oswiostat/oracleapps.localdomain\u iostat\u 12.06.28.1500.dat”不,它有
“archive/oswiostat/oracleapps.localdomain\u iostat\u 12.06.28.1500.dat”
@ikegami,它是实际的代码。在我的Linux系统上,根据strace的说法,
open(F,“newline\n”)
调用
open(“newline”*[sic]*,…)
,但是
stat“newline\n”
调用
stat(“newline\n”*[sic]*,…)
。你说得对,这是新线的麻烦。三个arg open似乎保留了换行符FWIW。那么修复方法是什么呢?@picrow than寻求帮助。很长一段时间后,我开始接触perl,感谢您的快速帮助。我需要更正if循环中的$stats2。这个变量应该是全局变量,我应该如何更正它。到目前为止,stats2显示为空。@picrow than以获取帮助。很长一段时间后,我开始接触perl,感谢您的快速帮助。我需要更正if循环中的$stats2。这个变量应该是全局变量,我应该如何更正它。截至目前,stats2显示为空。+1:Sinan:我需要此功能,我认为您的帖子对我有帮助。+1:Sinan:我需要此功能,我认为您的帖子对我有帮助。
my $data_file= `ls -t $data_dir | head -1`;
chomp($data_file);
use File::ChangeNotify;

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

while (my @events = $watcher->wait_for_events) {
    # ...
}