在你的问题中的代码:
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>)
然而,如前所述,这只会导致自open
语句无法打开一个目录错误“上未开封的文件处理文件的ReadLine()”。
你的检查
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
那么长的版本,给我的感觉你正在尝试做的比其他的东西是什么你的代码暗示。
来源
2013-03-15 14:00:48
TLP
请发问 – 2013-03-15 13:58:05
堆栈溢出有助于规划问题阅读之前,人http://stackoverflow.com/faq。你应该自己尝试过这个,并且遇到了一个你无法解决的编程问题。我们不能期望为您免费编写代码。 – Borodin 2013-03-15 14:01:45