不要想,當你可以基準:
use Benchmark 'cmpthese';
my $source = "\t\thello\n\t\t\tworld\n" x 100;
my $g_tab_width = 8;
my ($textU, $textN);
cmpthese(-3, {
ungreedy => sub {
$textU = $source;
$textU =~ s{(.*?)\t}{$1.(' ' x ($g_tab_width - length($1) % $g_tab_width))}ge;
},
negated => sub {
$textN = $source;
$textN =~ s{([^\n\t]*)\t}{$1.(' ' x ($g_tab_width - length($1) % $g_tab_width))}ge;
},
});
die "whoops" unless $textN eq $textU; # ensure they do the same thing
我發現,非貪婪版本(因爲它出現在降價源)比你建議否定字符類快約40%:
Rate negated ungreedy
negated 1204/s -- -30%
ungreedy 1718/s 43% --
我的猜測是,匹配.
比否定的字符類,它彌補了額外的回溯更有效。需要更多的測試來證實這一點。
來源
2010-11-12 08:29:55
cjm
這是我第一次理解perl的一行!沒有'$ _'或'@ _'或任何東西! – Kobi 2010-11-11 19:33:34
@Kobi。哈哈,當我第一次開始編程時,我的學習路徑是HTML - > JavaScript - > Perl。但是我十年來沒有碰過Perl。 – jordanbtucker 2010-11-11 19:49:43
@Kobi:如果你看到'$ _'(順便提一句,它的名字是「* it *」),那麼你可能看的不是很好的Perl代碼。 *它*在* *看起來最少的時候效果最好,在*默認自然風格的小塊中,比如'for(@list} {s/foo/bar/g}' – tchrist 2010-11-11 20:08:35