フォームからのよくあるデコード処理を私は以下のように書いてます。
(中略)
foreach $pair(@pairs){
($key,$value)=split(/=/,$pair);
$key=~ tr/+/ /;
$key=~ tr/,/_/;
$key=~ s/%([\dA-Fa-f][\dA-Fa-f])/pack("C",hex($1))/eg;
&jcode'convert(*key,'euc');
$value=~ tr/+/ /;
$value=~ tr/,/_/;
$value=~ s/%([\dA-Fa-f][\dA-Fa-f])/pack("C",hex($1))/eg;
&jcode'convert(*value,'euc');
$input{$key}=$value;
}

ところが、フォームでカンマを入力するとtr/,/_/で置換えられるはずだとおもうのですが、カンマはカンマのまま渡ってきてるようです。
tr///;はカンマを処理できないのでしょうか?
csvで書き出すとき問題があると思うのです。
ご存知の方いらっしゃいましたらよろしくお願い致します。

A 回答 (4件)

僕の環境 (AN HTTPD + ActivePerl 5.6.1) で試したところ、


harisunさんの質問通りでは変換されませんでした。
yostyさんの回答のように
tr/+,/ _/;
と記述しても変換されませんでした。

tr/// の場所が問題かもしれません。
下記のように、convert の後に記述すると変換できるようです。


foreach $pair(@pairs){
($key,$value)=split(/=/,$pair);

$key=~ tr/+/ /;
$key=~ s/%([\dA-Fa-f][\dA-Fa-f])/pack("C",hex($1))/eg;
&jcode'convert(*key,'euc');
$key=~ tr/,/_/;

$value=~ tr/+/ /;
$value=~ s/%([\dA-Fa-f][\dA-Fa-f])/pack("C",hex($1))/eg;
&jcode'convert(*value,'euc');
$value=~ tr/,/_/;

$input{$key}=$value;
}
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
わたしも位置を変えたらうまく処理できました。
とりあえずこれでいこうと思います。
ありがとうございました。

お礼日時:2002/02/23 22:17

うちの環境(redhat7.2/perl-5.6.0)で実際にためしたところ、harisunさんの書かれたままで正常に変換されました。


もしかすると、全角の「,」が残っているのではないでしょうか。
一度確認してみてください。

なお、trは文字一つ一つを見るので、/を変換する場合以外は\は不要です。
そもそも、「,」はs///でもエスケープする必要はありません。
それに、s///で書き直すなら、gオプションが必要です。
$key=~ s/,/_/g;
$value=~ s/,/_/g;

なお、技術評論社の「CGIリファレンス」でも、フォームの「+」の処理はtrで行っています。
ほかでもやはりtrの例が多いようですので、確かに速いのかも知れませんね。
ただし、現実的な違いは無かろうと思います。
trらしさ(?)を出して、
tr/+,/ _/;
と書くと、速く書けるという意味で言われたのかも知れません。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
>もしかすると、全角の「,」が残っているのではないでしょうか
全角半角の違いも意識してたのでそれはないと思います。
s/,/_/gでもうまくいきませんでした。
いろいろ調べていただいたようで、どうもありがとうございました。

お礼日時:2002/02/23 22:22

「\」がついていないからですね。


それと、なぜ「tr」を使うのですか?
普通はNo.1の方の言うように、「s」を使うと思いますけど?
従って、↓になります。
$key=~ s/\,/_/;
$value=~ s/\,/_/;
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
わたしも最初はs///でやったほうがいいと思っていたのですが、
ある人(仕事で専門的にやってる方)がtrの方が処理がはやいと
言っていたのです。(また聞くことはもう出来ません)
それで、tr///を使った場合、\を入れても駄目なようなんです。
どうしてなのか謎です。

お礼日時:2002/02/23 18:26

tr/// (変換演算子)


ではなく、
s/// (置換演算子)
で試してみてはいかがでしょうか?
    • good
    • 0
この回答へのお礼

ごかいとうありがとうございます。
そうですね。
それなら問題ないと思います。
ありがとうございます。

お礼日時:2002/02/23 18:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このカテゴリの人気Q&Aランキング

おすすめ情報

カテゴリ