您问题中的代码:
opendir (DIR, "LOCATION")|| die "cant open directory\n";
my @DATA = grep {(!/^\./)} readdir (DIR);
while ( my $file = shift @DATA) {
open FILE, "LOCATION";
while (FILE){
if ($file eq "235") {
print $_;
}
}
}
会这样做:
首先,它会方便地找到目录“LOCATION”中不以句点开头的所有文件。然后它将在每个文件名上进行一个相当奇怪的循环。这个循环的正常版本是:
for my $file (@DATA)
然后它将尝试再次打开目录“LOCATION”。这可能会失败,因为“LOCATION”是一个目录。由于您不使用 来检查返回值die
,因此该错误将保持沉默。
你可能想要的是使用
if ($file eq "235.txt") {
open my $fh, "<", $file or die $!;
print <$fh>;
}
这部分:
while (FILE)
实际上不是检查 的返回值readline()
,而是检查文件句柄是否返回真值。据我所知,即使open
失败,它也会返回一个真值。这当然意味着循环将无限期地运行。你的意思可能是
while (<FILE>)
但是,如前所述,这只会导致错误“readline() on unopened file handle FILE”,因为该open
语句无法打开目录。
你的支票
if ($file eq "235")
永远不会是真的,因为你说你的文件名有.txt
扩展名。你可能会这样做
if ($file eq "235.txt")
哪个应该工作。
如果你想聪明一点,你可以将你的检查直接包含在 grep 中:
my @files = grep { $_ eq "235.txt" } readdir DIR;
而且由于 perl 可以使用<>
菱形运算符来打印数组中列出的文件@ARGV
,你甚至可以这样做
@ARGV = grep { $_ eq "235.txt" } @ARGV;
print <>;
假设您使用以下命令调用脚本:
perl script.pl dir/*.txt
当然,这只是做的长版本:
perl -pe0 235.txt
哪个是长版
cat 235.txt
所以,我觉得你正在尝试做一些你的代码所暗示的事情。