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

Err, я не понимаю вашу проблему. Какой результат ожидался? Он должен работать нормально. Вы можете видеть, что никогда не будет разницы между '[1]' и '[2]'? – amon

+0

Это не извлечение данных из этих файлов ' /мнт/HGF,/PERL/назначение/тест/а/аа/1 - Копировать - копирование (2) .htm [2] /шоссе/HGF,/PERL/назначение/тест/b/bb/1 - Копировать - Копировать (2) .htm [2] ' –

ответ

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-файлов –

+1

Хорошо .. не ждите, что я сделаю домашнее задание для вас. Позвольте мне направить вас к прекрасной главе Mark Jason Dominus «Рекурсия» в [New Order Perl] (http://hop.perl.plover.com/). – Zaid

+0

Нет, пожалуйста, не поймите меня неправильно. Я стараюсь изо всех сил, но из-за моего отсутствия понимания perl даже небольшая ошибка может вызвать у меня неудачу, поэтому я просто помещаю свой qn здесь, чтобы вы, ребята, могли указать мне любую маленькую ошибку ошибки, которые я делаю. –

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

Благодарим за помощь. возможно, ошибка связана с моей рекурсивной частью. –

Смежные вопросы