フォームからのよくあるデコード処理を私は以下のように書いてます。
(中略)
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で書き出すとき問題があると思うのです。
ご存知の方いらっしゃいましたらよろしくお願い致します。
No.2
- 回答日時:
「\」がついていないからですね。
それと、なぜ「tr」を使うのですか?
普通はNo.1の方の言うように、「s」を使うと思いますけど?
従って、↓になります。
$key=~ s/\,/_/;
$value=~ s/\,/_/;
ご回答ありがとうございます。
わたしも最初はs///でやったほうがいいと思っていたのですが、
ある人(仕事で専門的にやってる方)がtrの方が処理がはやいと
言っていたのです。(また聞くことはもう出来ません)
それで、tr///を使った場合、\を入れても駄目なようなんです。
どうしてなのか謎です。
No.3
- 回答日時:
うちの環境(redhat7.2/perl-5.6.0)で実際にためしたところ、harisunさんの書かれたままで正常に変換されました。
もしかすると、全角の「,」が残っているのではないでしょうか。
一度確認してみてください。
なお、trは文字一つ一つを見るので、/を変換する場合以外は\は不要です。
そもそも、「,」はs///でもエスケープする必要はありません。
それに、s///で書き直すなら、gオプションが必要です。
$key=~ s/,/_/g;
$value=~ s/,/_/g;
なお、技術評論社の「CGIリファレンス」でも、フォームの「+」の処理はtrで行っています。
ほかでもやはりtrの例が多いようですので、確かに速いのかも知れませんね。
ただし、現実的な違いは無かろうと思います。
trらしさ(?)を出して、
tr/+,/ _/;
と書くと、速く書けるという意味で言われたのかも知れません。
ご回答ありがとうございます。
>もしかすると、全角の「,」が残っているのではないでしょうか
全角半角の違いも意識してたのでそれはないと思います。
s/,/_/gでもうまくいきませんでした。
いろいろ調べていただいたようで、どうもありがとうございました。
No.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;
}
ご回答ありがとうございます。
わたしも位置を変えたらうまく処理できました。
とりあえずこれでいこうと思います。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript Json のキーと値の出力の違いについて 2 2022/06/14 20:22
- JavaScript 追加ボタンを押した際に ok ボタンを押した場合のみ入力値が追記されるようにしたいです 6 2022/05/29 09:57
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- Visual Basic(VBA) エクセルVBAについて 8 2022/07/13 22:41
- Visual Basic(VBA) シフト表のコマで「ブロック」されている前の時間の「出」を同一列の「休」と入れ替えたいがふぇきません。 2 2023/08/02 18:49
- JavaScript 電車の運賃を出すプログラムを作っています。 2 2022/06/22 09:36
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- HTML・CSS 私の能力からして間違っていないような気がします。 4 2022/09/30 13:24
- PHP PHPでユーザー情報を入力して簡易ログイン機能をつくってみたのですが 1 2023/05/29 08:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
メモリをアドレスを直接指定し...
-
JSONで文字列が長い時
-
Perlでアルファベットを数...
-
クリックしたら順番に並び替わ...
-
CLispのloop内の挙動について
-
Application.ScreenUpdating = ...
-
パイソンのクラスについて
-
Pythonでターミナルに文字を出...
-
どちのほうがすきですか?
-
パイソンのクラスのブログラム
-
パイソンのクラスについて
-
パイソンプログラミング
-
【メモリ不足で落ちる(python)】
-
パソコン → パャRン
-
vscode 文字化け
-
[python] 文字列を変数名として...
-
実行時エラー 3020の対策
-
<SELECT>タグの折り返し
-
c++の構造体について
-
int(input("○○"))の使い方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JSONで文字列が長い時
-
メモリをアドレスを直接指定し...
-
フォームで入力した値を表示し...
-
【C#】数値の範囲チェックについて
-
ラズパイで感圧センサーを動か...
-
linq で 楽天ウェブサービスのX...
-
Perlでアルファベットを数...
-
CGIでのページ指定~その(2)
-
途中まで出来ているのですが‥(D...
-
CGIやPHPで外部ファイルの内容...
-
CGIからメールに書き出しする際...
-
デコードできない時があります><
-
gpioを使ってSPIをシミュレーシ...
-
フォームのINPUT NAM...
-
map(STL)でinsertを行いたいで...
-
Application.ScreenUpdating = ...
-
どちのほうがすきですか?
-
formで特定のinputを送信しない...
-
文字の横にプルダウンを表示さ...
-
16進の10進変換について
おすすめ情報