eval "\$var =~ s/$a/$b/";って

[上に] [前に] [次に]
やす 2000/03/17(金) 13:26:40
ラウンジの過去ログで以下がありました。
../200002/00020291.htm

たとえば、文字列の置き換え
$var =~ s/(aaa)/find $1/;
をパラメータ渡しで実現する場合、
$a="(aaa)";
$b="find $1";
として、
eval "\$var =~ s/$a/$b/";
となります。

で、質問ですが、
eval "\$var =~ s/$a/$b/";

\$var =~ s/$a/$b/;
の違いがわかりません。

また、
\$var =~ s/$a/$b/
の$varへのリファレンス\$varの中を置換するのですか?

ケン 2000/03/17(金) 15:10:20
>eval "\$var =~ s/$a/$b/"; と
>\$var =~ s/$a/$b/; の違いがわかりません。
evalを使うと$@に最後に評価した式の値が入るのでは?

http://www.tohoho-web.com/wwwperl2.htm#eval

\$varってリファレンスじゃなくて
メタ文字のエスケープですよね?!

以下リンク先の内容
>EMIさん
>eval "\$var =~ s/$a/$b/";
>で、どうでしょう?
>keptさん
>なるほど、エスケープのことを忘れていました。

やす 2000/03/17(金) 15:56:56
[[解決]]
>\$varってリファレンスじゃなくて
>メタ文字のエスケープですよね?!

ありゃ! よく読まなかった。
そうですね。

eval "\$var =~ s/$a/$b/";

$var =~ s/$a/$b/;
に関しては、エラー処理がなければ、ほぼ等価ですよね。
とりあえず、解決マークします。

ケンさん、ありがとうございました。

kept 2000/03/17(金) 15:59:17
>やすさん
>たとえば、文字列の置き換え
>$var =~ s/(aaa)/find $1/;
>をパラメータ渡しで実現する場合、
>$a="(aaa)";
>$b="find $1";
>として、
>eval "\$var =~ s/$a/$b/";
>となります。
$b='find $1';です。

ダブルクォートでは、$b='find $1';が評価された時点で、
$1が展開されるので、
$val =~ s/(aaa)/find $1/;
と、
$a = "(aaa)";
$b = "find $1";
eval "\$val =~ s/$a/$b/";
の結果は異なります。

今気づいたのですが、
$b = "find aaa";
にしてしまえば、
$val =~ s/$a/$b/;
でも大丈夫のようです。
でも、$1,$2,$3・・・て、たくさんあると面倒かも。

>eval "\$var =~ s/$a/$b/";
>と
>\$var =~ s/$a/$b/;
>の違いがわかりません。
ケンさんがおっしゃるように\$varはリファレンスではありません。
実際に、
>\$var =~ s/$a/$b/;
を実行されましたか?
私の環境(jperl5.004_04-980303)では、エラーがでました。

リファレンスの中を置換するには
$ref_to_var = \$varの場合
$$ref_to_var =~ s/(aaa)/find $1/;
または
eval "\$\$ref_to_var =~ s/$a/$b/";
でいけると思います。

やす 2000/03/17(金) 17:48:06
keptさん、ありがとうございます。
たしかに、勘違いしていました。

$b = "find $1";ときに

eval "\$var =~ s/$a/$b/";

$var =~ s/$a/$b/;
が同じ値を返していたので...。
よく考えると両方とも間違っていましたね。

$b='find $1';で、eval "\$var =~ s/$a/$b/";が正解ですね。
$b='find $1';で、$var =~ s/$a/$b/;は ''で$1なので$1が展開しませんね。

こんなところで、間違えないですか。
パールって奥が深い。では。

[上に] [前に] [次に]