文字列内の単語を置き換えようとしています。単語は変数に格納されるため、当然これを行います。
$sentence = "hi this is me";
$foo=~ m/is (.*)/;
$foo = $1;
$sentence =~ s/$foo/you/;
print $newsentence;
しかし、これはうまくいきません。
これを解決する方法について何か考えはありますか?なぜこれが起こるのですか?
Perl では、多くの回答が既に示しているように、文字列を正規表現に補間できます。その文字列補間の後、結果は有効な正規表現でなければなりません。
m//
最初の試行では、すぐに一致を実行しようとする一致演算子 を使用しました。その代わりに、正規表現の引用演算子を使用できます。
$foo = qr/me/;
そのディレクトリにバインドするか、補間することができます。
$string =~ $foo;
$string =~ s/$foo/replacement/;
詳しくqr//
はRegexp Quote-Like Operators in perlopを参照してください。
同じ変数を置き換える必要があります。そうしないと、変数$newsentence
が設定されておらず、Perl は何を置き換えればよいかわかりません:
$sentence = "hi this is me";
$foo = "me";
$sentence =~ s/$foo/you/;
print $sentence;
$sentence
以前の値を維持したい場合は、 にコピー$sentence
し$newsentence
て置換を実行できます。これは に保存され$newsentence
ます。
$sentence = "hi this is me";
$foo = "me";
$newsentence = $sentence;
$newsentence =~ s/$foo/you/;
print $newsentence;
$sentence
最初に にコピーする必要があります$newsentence
。
$sentence = "hi this is me";
$foo = "me";
$newsentence = $sentence;
$newsentence =~ s/$foo/you/;
print $newsentence;
小さいスクリプトでも、'use strict' と 'use warnings' を使用してください。あなたのコード スニペットは $foo と $newsentence を初期化せずに使用しており、「strict」はこれをキャッチします。「=~」は代入ではなく、マッチングと置換のためのものであることを忘れないでください。また、Perl の正規表現はデフォルトでは単語境界ではないことに注意してください。したがって、取得した式の例では $1 が「is me」に設定され、「is」が「this」の末尾に一致します。
文字列を 'hi this is me' から 'hi this is you' に変換しようとしていると仮定すると、次のようなものが必要になります。
my $sentence = "hi this is me";
$sentence =~ s/\bme$/\byou$/;
print $sentence, "\n";
正規表現では、'\b' は単語境界、'$' は行末です。's/me/you/' を実行するだけでもこの例では機能しますが、'this is merry old me' のような文字列がある場合、おそらく意図しない効果があり、'this is yourry old me' になります。