這個腳本搜索文字的線條和打印他們,而(),而重讀源文件中的每個迭代:全球正則表達式匹配在反引號結果
# 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做一些類型的緩存爲貓的結果,但使用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';
}
哪裏是兩個腳本之間的差異?我錯過了什麼?
這是個不錯的問題 – Zaid
對於那些沒有strace的人,你可以使用這個bash腳本'mycat'作爲'for i in aa bb cc;做回聲「$ {i} _ $ BASHPID」; (''chmod 755 mycat')。它會爲每個循環顯示不同的'$ BASH_PID'。 :) – jm666
也許backtick重用相同的內存緩衝區,並愚弄/ g認爲它是相同的字符串。 – BOC