2013-12-19 78 views
0

我試圖將目錄中的每個文本文件讀入一個變量,然後打印前100個字符,包括換行符。但是,Perl說這些文件即使確實存在,也不存在。Perl打開:沒有這樣的文件或目錄

use strict; 
use warnings; 

my $dir = "C:\\SomeFiles"; 
my @flist; 

open(my $fh, "dir /a:-d /b $dir |") || die "$!"; 

while (<$fh>) { 
    if ($_ =~ /.*(.txt)$/i) { 
     push(@flist, $_); 
    } 
} 

foreach my $f (@flist) { 
    print "$dir\\$f"; 
    my $txt = do { 
     local $/ = undef; 
     open(my $ff, "<", "$dir\\$f") || die "$!"; 
     <$ff>; 
    }; 
    print substr($txt, 0, 100); 
} 

當我運行該腳本,下面是寫入控制檯:

C:\SomeFiles\file1.txt 
No such file or directory at script.pl line 19, <$fh> chunk 10. 

它尋找正確的文件,我敢肯定,該文件存在。當我嘗試使用此方法打開單個文件而不是通過使用foreach的數組獲取每個文件時,它工作得很好。有什麼顯而易見的,我在這裏忽略了?

+0

當心隱藏空白:使用'chomp' – ThisSuitIsBlackNot

+0

而且,整個文件讀入內存僅僅打印前100個字符是浪費的。爲什麼不使用'read'? – ThisSuitIsBlackNot

+0

@ThisSuitIsBlackNot:打印前100個字符是一個示例任務,用於解釋我遇到的問題。我的真實任務涉及整個文件,與公開問題無關。 (在嘗試打開文檔之前,嘗試將其用於任何事情時發生該錯誤。) –

回答

4

一個更好的解決方案是使用READDIR()來代替(或File::Find如果你想這樣做遞歸):

my $dir = "C:\\SomeFiles"; 

opendir(my $dh, $dir) || die "$!"; 

while (my $file = readdir($dh)) { 
    if ($file =~ /\\.txt$/i) { 
     print $file . "\n"; 
     my $txt = do { 
      local $/ = undef; 
      open(my $ff, "<", "$dir\\$file") || die "$!"; 
      <$ff>; 
     }; 
     print substr($txt, 0, 100) . "\n"; 
    } 
} 

closedir($dh); 
+8

您應該從'opendir'命令中刪除管道符號。 – TLP

+0

感謝您的快速和有益的答案!我做了一些編輯以使其正常工作。我不熟悉File :: Find;你能否提供一個在這種情況下如何使用它的例子? –

+0

@TLP:謝謝;好點子。複製粘貼錯誤。 –

相關問題