これは正確に「単純な」質問ではないので、自分を殴らないでください。
問題は、単一/e
の場合、RHSはそのeval
結果が置換に使用されるコードであると理解されることです。
そのRHSは何ですか?です$1
。を評価すると、文字列$1
が含まれていることがわかります。これには、上記の変数の内容は含まれていません 。その後に、その後に、その後に。が続きます。 $var
$
v
a
r
したがって、2回評価する必要があります。1回はに変換$1
し、もう1回$var
は前の結果を$var
文字列に変換します"testing"
。これを行うには、演算子にdoubleee
修飾子を付けます。s
これは、1つで実行するのと2つで実行するので、非常に簡単に確認でき/e
ます。これは、両方のデモと、シンボリック逆参照を使用する3番目の方法です。これはパッケージシンボルテーブルを参照するため、パッケージ変数でのみ機能します。
use v5.10;
our $str = q(In this string we are $var the "e" modifier.);
our $var = q(testing);
V1: {
local $_ = $str;
s/(\$\w+)/$1/e;
say "version 1: ", $_;
}
V2: {
local $_ = $str;
s/(\$\w+)/$1/ee;
say "version 2: ", $_;
}
V3: {
no strict "refs";
local $_ = $str;
s/\$(\w+)/$$1/e;
say "version 3: ", $_;
}
実行すると、次のようになります。
version 1: In this string we are $var the "e" modifier.
version 2: In this string we are testing the "e" modifier.
version 3: In this string we are testing the "e" modifier.