OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
締切り
済み

tr///;はカンマを処理できないのですか?

  • 暇なときにでも
  • 質問No.223370
  • 閲覧数118
  • ありがとう数4
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 84% (213/251)

フォームからのよくあるデコード処理を私は以下のように書いてます。
(中略)
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で書き出すとき問題があると思うのです。
ご存知の方いらっしゃいましたらよろしくお願い致します。
通報する
  • 回答数4
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

回答 (全4件)

  • 回答No.1
レベル8

ベストアンサー率 68% (17/25)

tr/// (変換演算子) ではなく、 s/// (置換演算子) で試してみてはいかがでしょうか? ...続きを読む
tr/// (変換演算子)
ではなく、
s/// (置換演算子)
で試してみてはいかがでしょうか?
お礼コメント
harisun

お礼率 84% (213/251)

ごかいとうありがとうございます。
そうですね。
それなら問題ないと思います。
ありがとうございます。
投稿日時 - 2002-02-23 18:19:45
  • 回答No.2
レベル13

ベストアンサー率 25% (453/1783)

「\」がついていないからですね。 それと、なぜ「tr」を使うのですか? 普通はNo.1の方の言うように、「s」を使うと思いますけど? 従って、↓になります。 $key=~ s/\,/_/; $value=~ s/\,/_/; ...続きを読む
「\」がついていないからですね。
それと、なぜ「tr」を使うのですか?
普通はNo.1の方の言うように、「s」を使うと思いますけど?
従って、↓になります。
$key=~ s/\,/_/;
$value=~ s/\,/_/;
お礼コメント
harisun

お礼率 84% (213/251)

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

うちの環境(redhat7.2/perl-5.6.0)で実際にためしたところ、harisunさんの書かれたままで正常に変換されました。 もしかすると、全角の「,」が残っているのではないでしょうか。 一度確認してみてください。 なお、trは文字一つ一つを見るので、/を変換する場合以外は\は不要です。 そもそも、「,」はs///でもエスケープする必要はありません。 それに、s///で書き直すなら ...続きを読む
うちの環境(redhat7.2/perl-5.6.0)で実際にためしたところ、harisunさんの書かれたままで正常に変換されました。
もしかすると、全角の「,」が残っているのではないでしょうか。
一度確認してみてください。

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

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

お礼率 84% (213/251)

ご回答ありがとうございます。
>もしかすると、全角の「,」が残っているのではないでしょうか
全角半角の違いも意識してたのでそれはないと思います。
s/,/_/gでもうまくいきませんでした。
いろいろ調べていただいたようで、どうもありがとうございました。
投稿日時 - 2002-02-23 22:22:21
  • 回答No.4
レベル8

ベストアンサー率 68% (17/25)

僕の環境 (AN HTTPD + ActivePerl 5.6.1) で試したところ、 harisunさんの質問通りでは変換されませんでした。 yostyさんの回答のように tr/+,/ _/; と記述しても変換されませんでした。 tr/// の場所が問題かもしれません。 下記のように、convert の後に記述すると変換できるようです。 foreach $pair(@pairs ...続きを読む
僕の環境 (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;
}
お礼コメント
harisun

お礼率 84% (213/251)

ご回答ありがとうございます。
わたしも位置を変えたらうまく処理できました。
とりあえずこれでいこうと思います。
ありがとうございました。
投稿日時 - 2002-02-23 22:17:39
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ