半角英数字を一度に全角にすることはできないのですか?
[上に]
[前に]
[次に]
あき
1999/10/19(火) 03:39:24
いつも初歩的な質問ばかりですみません。
半角英数字を全角に変換したいので
$com_char=~s/[a-zA-Z0-9]/[a-zA-Z0-9]/;
と記述しましたが変換できませんでした。
16進で指定してみたらできるかと思い、
$char=~s/[a-z]/[\x82\x81-\x82\x9a]/;
にしてみましたが、やはり変換できませんでした。
結局1文字ずつ指定して変換しましたが、上記のように一斉に変換することはできないのですか?
Aurai
[E-Mail]
1999/10/19(火) 06:52:15
$i =~ s/([A-Za-z0-9])/"\x82".pack("C", (unpack("C",$1)+31+($1=~m|[a-z]|)))/eg;
無理矢理一行(笑)
先頭から一文字ずつやるのがスタンダードなのかも
ふじ
1999/10/19(火) 13:22:17
jcode.pl の jcode::tr で出来ます。
$_ = "123abcXYZ";
$match = "0-9a-zA-Z";
$replace = "0-9a-zA-Z";
jcode::tr(\$_, $match, $replace);
あき
1999/10/20(水) 15:35:30
いろいろありがとうございます。
ふじさんのご意見を取り入れたつもりで
$match = "0-9a-zA-Z";
$replace = "0-9a-zA-Z";
jcode::tr(\$com_char, $match, $replace);
として、$com_charにrstuvwxyzを1文字ずつ順番に入れて変換したら、
それぞれyzAuZZZZZに変換されてしまいました。
perl4のshift jisを使っているのですが、何か自分が重大な勘違いをしているような
気がするのですが・・・。
mm
1999/10/20(水) 22:59:15
jcode.pl,v 2.10 より引用
>;# Range operator like `A-Z' for 2 byte code is partially
>;# supported. Code must be JIS or EUC, and first byte
>;# have to be same on first and last character.
perl4 Shift-JIS なら、以下のようにしてください。
$match = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
$replace = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
&jcode'tr(*com_char, $match, $replace);
ところで、perl4 では、
>jcode::tr(\$com_char, $match, $replace);
はエラーになるんじゃないですか?
(エラーにならないとしたら、それは perl5…)
あき
1999/10/21(木) 01:53:46
[[解決]]
重ね重ね申し訳ありません。
実際にCGIを載せるプロヴァイダはperl4なのですが、
今はローカルでテストしているのでperl5が使えるのでエラーに
ならなかったのだと思います。
mmさんに教えていただいたようにやってみたらできました。
どうしてperl5の形式だとうまく変換できなかったのかは
よくわかっていないのですが・・・。
皆様ありがとうございました。
mm
1999/10/22(金) 00:23:40
>どうしてperl5の形式だとうまく変換できなかったのかは
>よくわかっていないのですが・・・。
今回の件は、jcode.pl の仕様の問題で、
(../199902/99020116.htm)
perlのバージョンとは直接関係ないと思いますが…
>jcode::tr(\$com_char, $match, $replace);
では、perl5依存の記法(&の省略、::、リファレンス)を使ってるので、
perl4では通らない。
>&jcode'tr(*com_char, $match, $replace);
なら、perl4用の古い記法なので、perl5でも通る。
[上に]
[前に]
[次に]