2015-11-16 73 views
-1

我正在Perl的程序開始階段工作,讀取匹配特定模式的目錄中的所有文件,然後解析它們中的每一個。如果代碼與文件在同一個目錄下,它就可以工作,但是我希望它能夠工作,無論程序位於何處,只要程序中的路徑是正確的。任何人都可以幫我解決如何做到這一點?Perl:讀取一個目錄的所有文件,錯誤:沒有這樣的文件或目錄

這裏是我到目前爲止的代碼:

#!/usr/bin/perl5.16.2 

my $dir = '/my/path/'; 

opendir(files, $dir) or die ("The directory could not be opened: $!"); 
@files = grep { /^jhu*/ && -f "$dir/$_" } readdir(files); 
closedir(files); 

foreach $file (@files) { 

    open(file, $file) or die "$!"; 

    while(<file>) { 

    $line = $_; 
    chomp($line); 

    @cols = split(/\t/, $line); 

    print "$cols[4]\n"; 
    } 
} 

close(file); 

謝謝!

+3

FAQ:這在文檔中有描述:'perldoc -f readdir' – toolic

+1

您可以使用strict和warnings pragmas來改進您的代碼 – red0ct

+0

有兩種核心方式可以列出文件系統目錄的內容,一種是使用[readdir](http://perldoc.perl.org/functions/readdir.html) 正如你所做的那樣,另一個是[glob](http://perldoc.perl.org/functions/glob.html) ,它實現了類似於命令行通配符語義的東西。這兩個將不分青紅皁白地包括目錄和文件。 'readdir'還有一個額外的問題,它會返回當前和父目錄的僞目錄'.'和'..'以及任何真實內容,並且只提供沒有任何關聯路徑的名稱 – Borodin

回答

0

之後您只需將目錄前置到@files的元素。

foreach $file (@files) { 
    open(my $fh, "$dir/$file") or die "Can't open $dir/$file: $!"; 
    while (<$fh>) { ... } 
    # ... 
} 

通知我以前也用過,而不是打開的裸字file,這是基於各種原因眉頭皺了詞法文件句柄。

+0

哇。咄。謝謝!並感謝關於文件句柄的提示。 Perl對我來說是一個全新的世界。 – nchimato

相關問題