perlでs///とtr///の違いがわかりません + アルファ

[上に] [前に] [次に]
ラウォッチ [E-Mail] [HomePage] 2000/01/21(金) 14:35:00
とあるCGIで以下の式がありました。わかる方教えて下さい。
$value内はHTMLソースです。

$value =~ s/<!--(.|\n)*-->//g;

あと、
$value2 =~ s/+/ /g;

$value2 =~ tr/+/ /;
は同じですか?
イマイチ、s///とtr///の違いがわかりません。
よろしくお願い致します。

茶しぶ男 2000/01/21(金) 14:47:38
$value =~ s/<!--(.|\n)*-->//g;

これは、SSI書きこみを禁止してるんでショ。

$value2 =~ tr/+/ /;

これは、ワタシ良くワカランです。

ふじ 2000/01/21(金) 15:37:13
> $value2 =~ s/+/ /g;
これだとエラーですね。
$value2 =~ s/\+/ /g;

得られる結果は tr/+/ /; と同じですが、tr の方が高速です。

use Benchmark;
@t = timethese(0 , {
    'TR' => '&tr;',
    'S' => '&s;',
});
sub tr{
    my ($a) = "gre+grtgregy+re43t+grtregeber+brehgw4th4thnb+gr";
    $a =~ tr/+/ /;
}
sub s{
    my ($a) = "gre+grtgregy+re43t+grtregeber+brehgw4th4thnb+gr";
    $a =~ s/\+/ /g;
}

実行結果
Benchmark: running S, TR, each for at least 3 CPU seconds...
        S:  3 wallclock secs ( 3.01 usr +  0.00 sys =  3.01 CPU) @ 56569.44/s (n=170274)
        TR:  5 wallclock secs ( 3.02 usr +  0.00 sys =  3.02 CPU) @ 145992.05/s(n=440896)

ラウォッチ 2000/01/21(金) 16:49:49
茶しぶ男さん、ふじさん、早速の回答ありがとうございました。

$value =~ s/<!--(.|\n)*-->//g;
は”これは、SSI書きこみを禁止してるんでショ。”
ですが、パール的に説明してもらえますか、よくわかりません。

ふじさんへ
わざわざ、Benchmarkまでしてもっらて、ありがとうございます。
trは正規表現でないのですね。知らなかったというより使ったことなかったです。
勉強になりました。

茶しぶ男 2000/01/21(金) 17:01:26
> $value =~ s/<!--(.|\n)*-->//g;
> は”これは、SSI書きこみを禁止してるんでショ。”
> ですが、パール的に説明してもらえますか、よくわかりません。

 一つ一つ説明すると…

-----------------------------------------------------------
 任意の文字(.)、又は(|)改行(\n)が、0文字以上続く場合は、それを削除する。
-----------------------------------------------------------

 ということですね。
 # カッコ内の文字は、その前に書かれてあることを表しています。

 つまり、SSIは例えば

<!--#exec cmd="〜"-->

 という風に記述しますが、それを掲示板に書かれた時には強制的に削除する…って、ことですね。

ラウォッチ 2000/01/21(金) 17:19:46
[[解決]]
理解できました。
正規表現が手足のように使えこなせるといいですね。

旧名ふにゃちんさん、ありがとう。旧名ちゃいちゃんパパより。

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