プロが教えるわが家の防犯対策術!

表示したい数字が1桁もしくは2桁でHTML表示を等幅指定で合わせたいので
数字を1桁なら半角、2桁以上は全角にしたいと思っています。

下のように記述して、思い通りの動きはしているのですが
もう少しスマートに記述できればと思い質問させていただきます。
みなさんなら、どう記述するか、ご教示ください。


$no = 1;

# 1桁の場合、半角から全角にする
if ($no == 0) { $no2 = "0"; }
if ($no == 1) { $no2 = "1"; }
if ($no == 2) { $no2 = "2"; }
if ($no == 3) { $no2 = "3"; }
if ($no == 4) { $no2 = "4"; }
if ($no == 5) { $no2 = "5"; }
if ($no == 6) { $no2 = "6"; }
if ($no == 7) { $no2 = "7"; }
if ($no == 8) { $no2 = "8"; }
if ($no == 9) { $no2 = "9"; }
if ($no >= 10) { $no2 = "$no"; }

print "$no2";

A 回答 (3件)

> 「use utf8;」で、スクリプト内で扱う文字コードを


> UTF8にする事で可能になるという理解でよろしいでしょうか?
ちょっと違う。
use utf8はスクリプト自体をUTF-8で記載することを宣言する物。
だからスクリプトはちゃんとUTF-8で保存してください。
これによって、perlは「スクリプト内」の文字列を正しく文字列として扱えます。

これでケアできるのは「スクリプト内」の文字列なので、
「スクリプト外」(STDINとかコマンドライン引数、ファイル)からやってきた文字列として扱うつもりのデータは
decodeしてperlが文字列として扱えるように変換しなければなりません。
(例えそのデータがUTF-8文字列であってもです、decodeを省略できるのはASCIIやLatin-1だけ。)

逆に、「スクリプト外」(STDOUTやファイル)に文字列を出す場合は、
所望の文字コードにencodeする必要があります。
ただし、PerlIOレイヤを使えばこの処理は若干省略可能です。
 binmode STDOUT, ":utf8";
はSTDOUTに出力するときのencodeを省略する為の物です。
これがないと、printのたびに
print encode( 'utf8', $no );
とかする必要があります。


use utf8で検索すれば上の方にこんなページが引っかかります。
http://www.rwds.net/kuroita/program/Perl_unicode …
http://hikoboshi.org/perl/utf8.html
http://blog.livedoor.jp/dankogai/archives/512241 …
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
いただいたソースを私なりに調べたのですが、詰めが甘かったです。

最近は、スクリプトをUTF-8で作成しています。
「use utf8」で、スクリプト内の文字列がそのまま使えるわけですね

エンコード・デコードに関しても勉強になりました。
挙げていただいたサイトも再読いたします。

詳しく解説いただきありがとうございました。

お礼日時:2012/01/14 20:06

素の状態では、「全角文字」は「2つの文字(Shift_JISの場合)」として処理されます。


よって tr/0-9/0-9/は tr/0-9/AB-CD/を書くようなものです。(ここでは、A:0の1バイト目、B:0の2バイト目..とします)
一文字として処理しなければならない「全角文字」がバラバラに処理されてしまうわけです。

use utf8 ; には、スクリプトがutf8で掛れていることを示すと同時に、utf8の「複数バイト文字」を「一文字」として処理するようになります。
これでtr/0-9/0-9/が 0と「全角の0」が1文字ずつ対応できるようになります。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
文字コードについて、再度、勉強しなおそうと思います。
詳しい解説ありがとうございました。

お礼日時:2012/01/14 20:08

> 数字を1桁なら半角、2桁以上は全角にしたいと思っています。


コードは逆だったのでコードの方を信用しました。


use utf8; #UTF-8で記載
use strict;
use warnings;

binmode STDOUT, ":utf8"; #環境に合わせる
#binmode STDOUT, ":encoding(euc-jp)";
#binmode STDOUT, ":encoding(cp932)";

my $no = 1;

if( 0 <= $no && $no <= 9 ){ $no =~ tr/0-9/0-9/; }
print "$no\n";
    • good
    • 0
この回答へのお礼

迅速な回答ありがとうございました。

> コードは逆だったのでコードの方を信用しました。

失礼しました。
コピーペーストで貼り付けたら、表示が半角と全角が逆になってしまいました。


以前「$no =~ tr/0-9/0-9/」は考えたのですが
上手く動作しませんでした。

「use utf8;」で、スクリプト内で扱う文字コードを
UTF8にする事で可能になるという理解でよろしいでしょうか?

お礼日時:2012/01/14 16:22

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!