Почему пока не зацикливается на grep? - PullRequest
0 голосов
/ 19 октября 2018

У меня есть этот фрагмент кода Perl:

open( FILENAME, "<", "some_valid_path");
my $needs_tags = 0;
if (!grep{/$open_tag/} <FILENAME>){
    $needs_tags = 1;
}
while ( <FILENAME> )
{
    warn "$_\n";
}

Проблема в том, что после grep, while больше не работает, вообще.Но если убрать grep, while работает.

Почему это поведение и как исправить?

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

grep налагает список контекст , в котором <> читает весь файл и возвращает список строк.

Таким образом, в файловом дескрипторе ничего не осталось для запуска while.

Если этот grep должен пройти через весь файл, то после этого seek вернуться к началу с seek FILENAME, 0, 0 и затем читать снова построчно.


Поскольку весь файл читается одновременно, он может также хранить строки в массиве и работать с этим

my @lines = <FILENAME>;
# chomp @lines;  # if needed

$needs_tags = 1 if not grep { /.../ } @lines;

for (@lines) { ... }
0 голосов
/ 19 октября 2018

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

Вы можете переместить указатель чтения с помощью seek:

seek(FILENAME, 0, SEEK_SET);

Если вы хотите сделать это за один проход чтения, вам сначала нужно будет захватить ввод в массив,затем grep и цикл снова.

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