-3

文字列内の単語を置き換えようとしています。単語は変数に格納されるため、当然これを行います。

$sentence = "hi this is me";
$foo=~ m/is (.*)/;

$foo = $1;
$sentence =~ s/$foo/you/;
print $newsentence;

しかし、これはうまくいきません。

これを解決する方法について何か考えはありますか?なぜこれが起こるのですか?

4

4 に答える 4

2

Perl では、多くの回答が既に示しているように、文字列を正規表現に補間できます。その文字列補間の後、結果は有効な正規表現でなければなりません。

m//最初の試行では、すぐに一致を実行しようとする一致演算子 を使用しました。その代わりに、正規表現の引用演算子を使用できます。

$foo = qr/me/;

そのディレクトリにバインドするか、補間することができます。

$string =~ $foo;
$string =~ s/$foo/replacement/;

詳しくqr//Regexp Quote-Like Operators in perlopを参照してください。

于 2013-09-30T17:44:39.660 に答える
2

同じ変数を置き換える必要があります。そうしないと、変数$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;
于 2013-09-06T13:30:34.160 に答える
2

$sentence最初に にコピーする必要があります$newsentence

$sentence = "hi this is me";

$foo = "me";

$newsentence = $sentence;
$newsentence =~ s/$foo/you/;

print $newsentence;
于 2013-09-06T13:30:42.033 に答える
1

小さいスクリプトでも、'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' になります。

于 2013-09-06T14:31:47.760 に答える