「i」などの正規表現修飾子を引用符で囲まれた正規表現に追加する簡単な方法はありますか? 例えば:
$pat = qr/F(o+)B(a+)r/;
$newpat = $pat . 'i'; # This doesn't work
私が考えることができる唯一の方法は、print "$pat\n"
戻って置換(?-xism:F(o+)B(a+)r)
で「i」を削除しようとすることです?-xism:
「i」などの正規表現修飾子を引用符で囲まれた正規表現に追加する簡単な方法はありますか? 例えば:
$pat = qr/F(o+)B(a+)r/;
$newpat = $pat . 'i'; # This doesn't work
私が考えることができる唯一の方法は、print "$pat\n"
戻って置換(?-xism:F(o+)B(a+)r)
で「i」を削除しようとすることです?-xism:
qr
保護されているため、既に持っている結果の中にフラグを入れることはできません。代わりに、これを使用します。
$pat = qr/F(o+)B(a+)r/i;
後で再コンパイルする限り、既存の正規表現を文字列であるかのように変更できます
my $pat = qr/F(o+)B(a+)r/;
print $pat, "\n";
print 'FOOBAR' =~ $pat ? "match\n" : "mismatch\n";
$pat =~ s/i//;
$pat = qr/(?i)$pat/;
print $pat, "\n";
print 'FOOBAR' =~ $pat ? "match\n" : "mismatch\n";
出力
(?-xism:F(o+)B(a+)r)
mismatch
(?-xism:(?i)(?-xsm:F(o+)B(a+)r))
match
唯一の方法は、RE を文字列化し、(-i) を (i-) に置き換えて、再度引用することです。
my $pat = qr/F(o+)B(a+)r/;
my $str = "$pat";
$str =~ s/(?<!\\)(\(\?\w*)-([^i:]*)i([^i:]*):/$1i-$2$3:/g;
$pati = qr/$str/;
更新: perl 5.14 は正規表現を別の方法で引用するため、私のサンプルはおそらく次のようになります。
my $pat = qr/F(o+)B(a+)r/;
my $str = "$pat";
$str =~ s/(?<!\\)\(\?\^/(?^i/g;
$pati = qr/$str/;
しかし、手元に perl 5.14 がなく、テストできません。
UPD2:エスケープされた左括弧のチェックにも失敗しました。