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が展開しませんね。
こんなところで、間違えないですか。
パールって奥が深い。では。
[上に]
[前に]
[次に]