2013-05-09 40 views
0
sub open_files { 

    my @files = @_; 
    my @lines; 

    foreach (@files){ 
     print "$_\[1\]\n"; 
    } 

    foreach my $f (@files){ 
     print "$f\[2\]\n"; 
     open(my $fh,'<',$f) or die " '$f' $!"; 
      print "$fh\[3\]\n"; 
     push(@lines,<$fh>); 
     close($fh); 
    } 

    return @lines; 
} 

嗨,我打開文件的絕對路徑存儲在一個數組中存在問題。Glob是不同的值錯誤打開文件和讀取

我想要做的是通過數組並打開每個文件,然後將它們的數據存儲在@lines數組中,然後關閉文件句柄。

但是我能夠打開.html文件中存儲的第一個孩子目錄.e.g /a/abc.html or /b/bcd.html但它是不開放(或解析),其在撒哈拉子目錄中的文件,如/a/aa/abc.html or /b/bb/bcd.html

我已經把在我的一些額外的print statements在我的腳本和編號他們的輸出爲不同的打印行例如[1] [2] [3]

這是執行上面的代碼的結果:

完整的代碼是:pastebin Full code

/mnt/hgfs/PERL/assignment/test/a/aa/1 - Copy - Copy (2).htm[1] 
/mnt/hgfs/PERL/assignment/test/a/aa/1 - Copy - Copy (2).htm[2] 
GLOB(0x898ad20)[3] 
/mnt/hgfs/PERL/assignment/test/b/bb/1 - Copy - Copy (2).htm[1] 
/mnt/hgfs/PERL/assignment/test/b/bb/1 - Copy - Copy (2).htm[2] 
GLOB(0x898ae40)[3] 
/mnt/hgfs/PERL/assignment/test/a/1 - Copy - Copy (2).htm[1] 
/mnt/hgfs/PERL/assignment/test/b/1 - Copy - Copy (2).htm[1] 
/mnt/hgfs/PERL/assignment/test/c/1 - Copy - Copy (2).htm[1] 
/mnt/hgfs/PERL/assignment/test/a/1 - Copy - Copy (2).htm[2] 
GLOB(0x898ae40)[3] 
/mnt/hgfs/PERL/assignment/test/b/1 - Copy - Copy (2).htm[2] 
GLOB(0x898ae40)[3] 
/mnt/hgfs/PERL/assignment/test/c/1 - Copy - Copy (2).htm[2] 
GLOB(0x898ae40)[3] 

如果你們在這裏需要完整的代碼是:pastebin Full code

+2

錯了,我不明白你的問題。預期的產出是什麼?它應該是行得通的。你可以看到'[1]'和'[2]'之間永遠不會有區別嗎? – amon 2013-05-09 13:45:42

+0

它不從這些文件中提取數據 ' /mnt/hgfs/PERL/assignment/test/a/aa/1 - Copy - Copy(2).htm [2] /mnt/hgfs/PERL/(2).htm [2] ' – 2013-05-09 13:46:39

回答

1

簡短的回答是glob不會遞歸到子目錄中。

相反,使用File::Find

use strict; 
use warnings; 
use feature 'say'; 
use File::Find 'find'; 

my @files; 
find(sub { push @files, $File::Find::name if /\.html?$/ }, 'base_dir'); 

say for @files; 
+0

嗯,我這樣做是爲了一個理工學院的項目,這個任務要求我只使用'Cwd();'而不是其他的方法,所以我必須做手動遞歸來獲得所有的子目錄,然後在其中的文件,然後解析它們並收集數據,例如電子郵件地址從html文件 – 2013-05-09 13:49:51

+1

呃..不要指望我爲你做功課。讓我來推薦Mark Jason Dominus關於[Higher Order Perl](http://hop.perl.plover.com/)遞歸的優秀篇章。 – Zaid 2013-05-09 13:57:22

+0

不,請不要誤會我錯我正在盡我所能,但由於我對perl缺乏瞭解,即使是一個小錯誤也會導致我一個挫折,所以我只是把我的qn放在這裏,以便你們可以指出我任何小我正在犯的錯誤。 – 2013-05-09 13:59:31

2
use warnings; 
use strict; 

die "Usage: $0 (abs path to dir) " if @ARGV != 1; 

my $dir = shift @ARGV; 
our @html_files =(); 

file_find($dir); 
print "html files: @html_files\n"; 

sub file_find { 
    my $dir = shift; 

    opendir my $dh, $dir or warn "$dir: $!"; 
    my @files = grep { $_ !~ /^\.{1,2}$/ } readdir $dh; 
    closedir $dh; 

    for my $file (@files) { 
     my $path = "$dir/$file"; 

     push @html_files, $file if $file =~ /\.html$/; 
     file_find($path) if -d $path; 
    } 
} 
+0

謝謝你的幫助。也許錯誤是由於我的遞歸部分。 – 2013-05-09 14:23:37