私は、ユーザーがテキスト、検索パターン、および置換文字列を入力するPerlプログラムを持っています。
、ユーザが置換文字列に変数($1
など)またはバックスラッシュエスケープ(のような\u
または\L
)を取り込む入力した場合、私は、置換文字列による検索パターンを交換するs///
演算子を使用しますが、このシナリオでいます置換パターンはこれらのメタキャラクタを処理する必要がありますが、文字列として扱います。
#!/usr/bin/perl -w
use strict;
chomp(my $text = <STDIN>); #read the text
chomp(my $regex = <STDIN>); #read the search pattern
chomp(my $replace = <STDIN>); #read the replacement pattern
$text=~s/$regex/$replace/g; # do replacement
print $text,"\n";
このコードのためのサンプル入力が
fred flintstone and wilma flintstone are good couples
(fred|wilma) flintstone
\u\L$1\E Flintstone
出力されるIは、方法を発見した
\u\L$1\E Flintstone and \u\L$1\E Flintstone are good couples
される上記のコードのためのものである:
Iは、次のコードを持っています次のコードでこれを修正してください:
このコードはFred Flintstone and Wilma Flintstone are good couples
として正しい出力を与える
#!/usr/bin/perl -w
use strict;
chomp(my $text = <STDIN>);
chomp(my $regex = <STDIN>);
chomp(my $replace = <STDIN>);
$replace = '"' . $replace . '"'; # creating the string as '"\u\L$1\E Flintstone"'
$text = ~s/$regex/$replace/gee; # applying double evaluation
print $text,"\n";
は、今私は、この問題のためのよりよい方法があるかどうかを知りたいですか?ユーザが入力した任意の並べ替えのコードを実行することは常に危険であり、さらには単純な文字列は、可能性があります
いいえ、いい方法はないと思います。 's ///'で評価オプションを使わなければなりません。ただし、ユーザーを信頼しないと危険です。 – redneb
参照[ユーザーから右側が入力されているときにs ///演算子でee修飾子を安全に使用する](http://stackoverflow.com/questions/29107353/using-the-ee-modifier-safely-with-右手側入力時) –
..そして[String :: Substitution](https://metacpan.org/pod/String::Substitution) –