[perl] 置換で、tr と s に関する質問

[上に] [前に] [次に]
perl初心者 2000/01/29(土) 21:22:39
$str =~ tr/&/&/; → 何も起こらず
$str =~ s/&/&/g → 置換されず

なのですが、これが正しい動きなのでしょうか?

tr と sの違いがイマイチよく分かりません。
とほほリファレンスも未稿なので。。。

Yosh 2000/01/29(土) 22:55:23
うーん、、この辺りはPerlの基本なんやけどなぁ、、、

ま、説明するとやな
trは、それぞれ対応した変換
sは正規表現の変換、、、、
説明がこんなんでええかわからんが、あんさんの例で言えば

$str =~ tr/&/&/; は何も起こらないというより処理されて
結果、変わらないっちゅー感じやな。つまり
一番目の、「&」が二番目の「&」に変換されてるわけ。もっと
具体的に説明すると、「tr/123/abc」を例に取ると
1はa、2はb、3はcに変換される。要するにそれぞれの順番に対応
した変換がわれるわけ。だから、tr/&/&/;は当然「&」
に変換されちゃうわけやな。もし、tr/&1/&/;とすれば
&aに変換される。。。分かったかなぁ?
次のs/&/&/g;は別に置換されるけどなぁ、、、

ま、ともかくPerlをやるなら正規表現はマスターした
ほーがええな、、、

デコード隊長 2000/01/31(月) 18:16:40
>$str =~ s/&/&/g → 置換されず

を、$str =~ s/\&/\&amp\;/g;(←おわりの『;』忘れないでね)
としてはいかがでしょう?
&や;は正規表現などでも使われているので、エスケープした方がよいかもしれないです。
間違ってたらごめんね。

びぎな++ 2000/02/01(火) 13:31:50
>$str =~ s/\&/\&amp\;/g;(←おわりの『;』忘れないでね)
>としてはいかがでしょう?
「¥」はなくても $str =~ s/&/&/g; だけでできるとおもいますけど。
perlの正規表現で特別な意味を持つメタ文字は
\ ^ . $ | () []
でこれらそのものにマッチさせるときには \ でエスケープする。
あってませんか?
http://www.perl.com/pub/doc/manual/html/pod/perlre.html#Regular_Expressions

デコード隊長 2000/02/01(火) 17:12:25
>\ ^ . $ | () []
>でこれらそのものにマッチさせるときには \ でエスケープする。
>あってませんか?

あってます。ちょっと書き方が悪かったです、ゴメンなさい。
&ってPerlの中でも使ってます。(サブルーチン呼び出しなど)
ついでに;も一番おしりにつけますよね。
そういうのは、やはり正規表現でなくてもエスケープはした方がいいと思います。

びぎな++ 2000/02/02(水) 16:11:15
まだ解決されてないようなので教えてください。

上のぼくの発言は
$a = "l;kjfenalivea&fdasdfnae&fjdas;dhfwnvda";   #要は適当な文字列の中に「&」と「;」を入れただけです。
$a =~ s/&/&/g;
というテストをして言ったことなんですが,

>$str =~ s/\&/\&amp\;/g;(←おわりの『;』忘れないでね)

>そういうのは、やはり正規表現でなくてもエスケープはした方がいいと思います。

から,具体的にどんなときに不具合が生ずるものなのですか?
現にPerl初心者さんはうまくいってないようですし・・・

ラウォッチ 2000/02/02(水) 17:41:39
Yoshさんと同じです。
$str =~ s/&/&/g;が上手く行かないのはバーションが関係あったりして?
ちなみに、5.004_04では問題なく置換されました。

びぎな++さんへ
>から,具体的にどんなときに不具合が生ずるものなのですか?
生じないと思います。(すくなくとも上記バーションのPerlでは)

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