-PR-
締切済み

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

  • 暇なときにでも
  • 質問No.223370
  • 閲覧数119
  • ありがとう数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/// (置換演算子)
で試してみてはいかがでしょうか?
お礼コメント
harisun

お礼率 84% (213/251)

ごかいとうありがとうございます。
そうですね。
それなら問題ないと思います。
ありがとうございます。
投稿日時 - 2002-02-23 18:19:45


  • 回答No.2
レベル13

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

「\」がついていないからですね。
それと、なぜ「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///で書き直すなら、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){
($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で解決しましたか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

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

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

特集


専門家があなたの悩みに回答!

ピックアップ

ページ先頭へ