2013-05-09 41 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