Извлечение имен файлов - PullRequest
       3

Извлечение имен файлов

3 голосов
/ 06 декабря 2011

Я пишу скрипт, который берет список файлов из каталога, открывает каждый и затем ищет строки, содержащие имя файла с расширением .zip. Затем я хочу удалить только имя файла из строки. Вот мой код:

foreach (@fnames) {
    chomp ($_);
    open FILE, '<', "$_";
    @archives = grep { /.+?\.zip/ } <FILE>;

    foreach (@archives) {
        if ($_ =~ /("|>)(.+?)("|<)/) { push @files, $2; }
    }
}

Файлы, из которых я извлекаю данные, будут содержать имена файлов .zip между двойными кавычками или угловыми скобками. Этот код ничего не возвращает, но я знаю, что там есть имена файлов. Если я делаю grep в терминале, я вижу их все, но grep в Perl мне ничего не дает. Есть идеи?

Ответы [ 2 ]

6 голосов
/ 06 декабря 2011

Возможные ошибки:

  • @fnames пусто из-за какой-то ошибки в коде, который вы не показываете.
  • open FILE, ... не удалось, но вы не проверяливозвращаемое значение open, оно молча терпит неудачу, следовательно, вы не знаете об этом.Используйте open ... or die $!
  • В вашем вводе прописные буквы, например, ZIP, и вы не используете опцию /i игнорировать регистр в grep.Кстати, .+? в начале довольно бесполезен, если только вы не ожидаете нежелательных строк, начинающихся с .zip (то есть он проверяет, есть ли хотя бы один символ раньше).
  • Оператор if внутривторой цикл будет захватывать только первое совпадение.

Также:

  • Вы должны использовать лексический дескриптор файла с open.
  • Вы должны использовать строгийи предупреждения, если вы этого еще не сделали.
  • my @archives и my @files в соответствующей лексической области помогут вам получить и сохранить нужные данные.
  • $_ =~ /.../можно просто написать /.../ для лучшей читабельности (IMO).
  • Вам (на самом деле) не нужна переменная перехода.
  • ("|>) - избыточный способ сказать [">].
  • grep - избыточная обработка.Вы можете просто сделать:

while (<FILE>) {
      push @files, /[">](.*\.zip)["<]/ig;
}

Короче говоря:

my @files;
foreach my $file (@fnames) {
    chomp $file;
    open my $fh, '<', $file or die $!;
    while (<$fh>) {
        push @files, /[">](.*\.zip)["<]/ig;
    }
}
print "File names found: @files\n";
0 голосов
/ 06 декабря 2011

В вашем скрипте вы ничего не выводите, вы просто меняете элементы в массиве. Вы должны print свои строки или использовать Tie::File для доступа к каждому файлу напрямую как к массиву.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...