Glob - это ошибка другого значения при открытии файла и чтении

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;
}

Привет, у меня проблемы с открытием файлов, абсолютный путь которых хранится в массиве.

Что я хочу сделать, так это пройти через массив и открыть каждый файл, а затем сохранить их данные в массиве @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 Полный код

/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 Полный код


person KAKAK    schedule 09.05.2013    source источник
comment
Эээ, я не понимаю твоей проблемы. Какой результат ожидался? Он должен работать нормально. Вы видите, что никогда не будет разницы между [1] и [2]?   -  person amon    schedule 09.05.2013
comment
Он не извлекает данные из этих файлов `/ mnt / hgfs / PERL / assignment / test / a / aa / 1 - Copy - Copy (2) .htm [2] / mnt / hgfs / PERL / assignment / test / b / bb / 1 - Копировать - Копировать (2) .htm [2] `   -  person KAKAK    schedule 09.05.2013


Ответы (2)


Короткий ответ заключается в том, что 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;
person Zaid    schedule 09.05.2013
comment
Что ж, я делаю это для политехнического проекта, и задание требует от меня только use Cwd(); и никаких других методов, поэтому мне нужно выполнить ручную рекурсию, чтобы получить все дочерние каталоги, а затем файлы в них, а затем проанализировать их и собрать данные, например. адрес электронной почты из файлов html - person KAKAK; 09.05.2013
comment
Ну .. не ждите, что я сделаю за вас домашнее задание. Позвольте мне вместо этого отослать вас к превосходной главе Марка Джейсона Доминуса о рекурсии в Perl высшего порядка. - person Zaid; 09.05.2013
comment
Нет, пожалуйста, не поймите меня неправильно, я стараюсь изо всех сил, но из-за моего непонимания perl даже небольшая ошибка может вызвать у меня неудачу, поэтому я просто помещаю сюда свой qn, чтобы вы, ребята, могли указать мне на любые мелкие ошибки Я делаю. - person KAKAK; 09.05.2013
comment
Это нормально. Однако вы не опубликовали рекурсивную часть своего кода, поэтому можно предположить, что у вас ее нет. - person Zaid; 09.05.2013
comment
о, я связал это, возможно, вы это пропустили, весь мой код связан с pastebin под полем, содержащим ошибки, спасибо - person KAKAK; 09.05.2013
comment
Пожалуйста, разместите это здесь. Я, например, не могу получить к нему доступ через pastebin. - person Zaid; 09.05.2013
comment
позвольте нам продолжить это обсуждение в чате - person KAKAK; 09.05.2013

person    schedule
comment
Спасибо за помощь. возможно, ошибка связана с моей рекурсивной частью. - person KAKAK; 09.05.2013