在你的問題中的代碼:
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