0

我的脚本检查此目录 /var/spool/gammu/inbox/ 中最后修改的文件

#!/usr/bin/perl -w
use strict;
use warnings;
chomp (my $dirname ='/var/spool/gammu/inbox/');
my $newest_file = do {
opendir my $dh, $dirname or die "Could not open '$dirname' for reading: $!\n";
my @by_age  = sort { -M $a <=> -M $b } grep -f, readdir ($dh);
$by_age[0];
};

open my $file, '<', $newest_file or die qq{Unable to open "$newest_file" for input: $!};
my @rows = <$file>;
close ($file);
print "@rows\n";

我越来越:

在 ./checken.pl 第 16 行打开时使用未初始化的值 $newest_file。

在 ./checken.pl 第 16 行的连接 (.) 或字符串中使用未初始化的值 $newest_file。

无法打开“”输入:./checken.pl 第 16 行的 Datei oder Verzeichnis nicht gefunden。

4

2 回答 2

1

我会建议您在文件之前预先结束目录名称(以提供绝对路径)map,然后将其提供给grep.

它应该如下所示:

my @by_age  = sort {-M $a <=> -M $b} grep {-f $_} map {"$dirname/$_"} readdir ($dh);
于 2016-04-11T08:35:31.370 回答
0

也许我在对您之前的问题的解决方案中没有足够强调这一点。我写

如果您想对 cwd 以外的目录执行此操作,那么仅chdir使用它并使用此代码可能比尝试opendir特定目录最简单,因为您必须先构建每个文件的完整路径才能利用-M

问题是返回的数据readdir只是一个没有任何路径信息的裸文件名,如果文件在当前工作目录以外的目录中,那么不添加路径信息就找不到

如果您只是chdir先进入目录,那么一切都会正常工作。这是您的代码的整理版本

#!/usr/bin/perl

use strict;
use warnings;

chomp(my $dirname = "/var/spool/gammu/inbox/");
chdir $dirname or die qq{Unable to chdir to "$dirname": $!};

my $newest_file = do {
    opendir my $dh, '.' or die "Could not open '$dirname' for reading: $!\n";
    my @by_age  = sort { -M $a <=> -M $b } grep -f, readdir ($dh);
    $by_age[0];
};

open my $file, '<', $newest_file or die qq{Unable to open "$newest_file" for input: $!};
print while <$file>;

或者,如果您有理由避免更改程序中的目录(一旦程序退出,更改将不会反映在您的 shell 中),那么您应该在使用它之前使用rel2absfromFile::Spec::Functions来构造完整的文件路径

#!/usr/bin/perl

use strict;
use warnings;

use File::Spec::Functions 'rel2abs';

chomp(my $dirname = "/var/spool/gammu/inbox/");

my $newest_file = do {
    opendir my $dh, '.' or die "Could not open '$dirname' for reading: $!\n";
    my @files = map { rel2abs($_, $dirname) } grep -f, readdir ($dh);
    my @by_age  = sort { -M $a <=> -M $b } @files;
    $by_age[0];
};

open my $file, '<', $newest_file or die qq{Unable to open "$newest_file" for input: $!};
print while <$file>;

其他几点

  • use warnings优于-w命令行。你不应该同时使用

  • 除非需要,否则最好避免将整个文件读入内存。一次可以读取和打印一个文件

于 2016-04-11T16:05:18.660 回答