Этот script ищет строки со словами и печатает их, а перечитывает исходный файл на каждой итерации:
# cat mm.pl
#!/usr/bin/perl
use strict;
use warnings;
while( `cat aa` =~ /(\w+)/g ) {
print "$1\n";
}
Входной файл:
# cat aa
aa
bb
cc
Результат:
# ./mm.pl
aa
bb
cc
Пожалуйста, объясните мне, почему запуск script не бесконечный.
В любом случае смещение итерации для двигателя regex должно быть reset, потому что выражение изменено (новый cat раздвоен).
Я думал, что perl делает какое-то кэширование для результата cat, но strace утверждает, что кошка была порождена 4 раза (3 для 3 строк + 1 для ложных при условии):
# strace -f ./mm.pl 2>&1 | grep cat | grep -v ENOENT
[pid 22604] execve("/bin/cat", ["cat", "aa"], [/* 24 vars */] <unfinished ...>
[pid 22605] execve("/bin/cat", ["cat", "aa"], [/* 24 vars */] <unfinished ...>
[pid 22606] execve("/bin/cat", ["cat", "aa"], [/* 24 vars */] <unfinished ...>
[pid 22607] execve("/bin/cat", ["cat", "aa"], [/* 24 vars */] <unfinished ...>
С другой стороны, следующий пример выполняется навсегда:
# cat kk.pl
#!/usr/bin/perl
use strict;
use warnings;
my $d = 'aaa';
while( $d =~ /(\w+)/g ) {
print "$1\n";
$d = 'aaa';
}
Где разница между двумя сценариями? Что мне не хватает?