m//gとm//gcの違い
m//gとm//gcにはどんな違いがあるのでしょうか。
いくつか解説を見たのですが、どれも「m//gではマッチに失敗すると通常は文字列の検索位置が文字列の先頭にリセットされるが、cをつける (m//gc) と、これを防ぐことができる」のような感じでさらっと説明されていて、イマイチ理解できません。スクリプトを適当に作成して試してみたのですが、cをつけてもつけなくても結果は変わらないような気がします。これは、つまり、cがあるときと無いときの違いは、効率の違いとして現れるだけで一般的にはcをつけておけばいいと考えていいのでしょうか。
http://perldoc.jp/docs/perl/5.6.1/perlop.pod#item_m_PATTERN_cgimosx
以下のスクリプトはindex関数的に配列@strの各要素文字列に含まれる検索文字列$findwordの位置を表示させるものですが、やはりcをつけてもつけなくても結果は変わりませんでした。
my @str = ('pattern match', 'at random', 'exponentiation operator');
my $findword = 'at';
my $len = length $findword;
print "search '$findword'\n\n";
foreach my $str (@str) {
my $count;
print '0123456789' x 3, "\n";
print "$str\n";
{
if ($str =~ /$findword/ogc) { printf("match%d: %d\n", ++$count, pos($str)-$len) }
else { print "\n"; last }
redo;
}
}
# /oはパターン内の不変変数を一度コンパイルすれば十分というものです
お礼
よく分かりました。 ありがとうございました。