Можно ли пропустить целый файл с помощью оператора <>? - PullRequest
10 голосов
/ 14 сентября 2009

Следующий код Perl имеет очевидную неэффективность;

while (<>)
{
if ($ARGV =~ /\d+\.\d+\.\d+/) {next;}
... or do something useful
}

Код будет проходить через каждую строку файла, который нам не нужен.

В отношении размера файлов, на которых выполняется этот конкретный сценарий, вряд ли что-то изменится, но ради обучения; Как я могу выбросить весь файл <> и перейти к следующему?

Цель этого заключается в том, что, поскольку сервер запускает этот скрипт, хранит старые версии приложений с номером версии в имени файла, меня интересует только текущая версия.

Ответы [ 3 ]

20 голосов
/ 14 сентября 2009

Решение Пола Руба будет лучшим, если вы сможете отфильтровать @ARGV до того, как начнете читать файлы.

Если вам нужно пропустить файл после начала его итерации,

while (<>) {
    if (/# Skip the rest of this file/) {
        close ARGV;
        next;
    }
    print "$ARGV: $_";
}
15 голосов
/ 14 сентября 2009

grep ARGV первый.

@ARGV = grep { $_ !~ /\d+\.\d+\.\d+/ } @ARGV;

while (<>)
{
  # do something with the other files
}
9 голосов
/ 14 сентября 2009

Ответ Пола Руба работает для получения дополнительной информации, см. Раздел операторов ввода-вывода man-страницы perlop . Упоминается схема использования grep, а также несколько других вещей, связанных с <>.

Обратите внимание на упоминание ARGV :: readonly относительно таких вещей, как:

perl dangerous.pl 'rm -rfv *|'
...