が各反復にソースファイルを再読み込みしながらこのスクリプトは、単語と行を検索し、それらを印刷:一方グローバル正規表現一致を()バックティック結果に
# 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
なぜ私は説明してくださいtは無限ではありません。正規表現エンジンのオフセットごとしばらく反復式が変更されるためをリセットしなければならないで
(新しい猫がフォークされます)。
私はperlが猫結果のキャッシュのいくつかの種類がないと思ったが、猫を4回(偽のために3×3の行+ 1条件ながら)生み出したことをstraceの主張:オン
# 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';
}
どこに2つのスクリプトの違いはありますか?私は何が欠けていますか?
これはいい質問です – Zaid
straceなしで、このbashスクリプト 'mycat'を' for a i in aa bb cc;として使うことができます。 echo "$ {i} _ $ BASHPID"; done'(ofc 'chmod 755 mycat')です。ループごとに異なる '$ BASH_PID'を表示します。 :) – jm666
おそらくバックティックは同じメモリバッファを再利用しており、/ gを同じ文字列であると思うように欺くのかもしれません。 – BOC