半角英数字を一度に全角にすることはできないのですか?

[上に] [前に] [次に]
あき 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でも通る。

[上に] [前に] [次に]