2013-03-15 65 views
-3

我如何循環目錄中的文件,根據文件名找到文件並打印文件內容?Perl循環通過目錄中的文本文件,根據文件名和打印內容找到文件

請參見下面的代碼: 目錄中的文件:

1234.txt 
345.txt 
234.txt 

代碼:

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 $_; 
     } 
    } 
} 
+1

請發問 – 2013-03-15 13:58:05

+3

堆棧溢出有助於規劃問題閱讀之前,人http://stackoverflow.com/faq。你應該自己嘗試過這個,並且遇到了一個你無法解決的編程問題。我們不能期望爲您免費編寫代碼。 – Borodin 2013-03-15 14:01:45

回答

-1

在你的問題中的代碼:

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 

那麼長的版本,給我的感覺你正在嘗試做的比其他的東西是什麼你的代碼暗示。

-1

這應該做(未經測試):

opendir(DIR, "/path/to/dir"); 
while (my $entry = readdir(DIR)) { 
    if ($entry =~ /^$filenameImLookingFor$/) { 
     open(FILE, "$entry/$filenameImLookingFor"); 
     my @lines = <FILE>; 
     close(FILE); 
     print(join('', @lines); 
    } 
} 
closedir(DIR); 
相關問題