Perl | |
こんばんは、AzureStone(あーじゅ・すとーん)です
昨日の続きです。朝、起きてこのブログを見てみると!なんとコメントが!!!ありがとうございます!!
でも恥ずかしいことにコメントを見てすぐに何を言っているのかが、よく理解できませんでした。
でも焦らず頂いたコメントの単語を調べていくと以下のことが理解できました。
今回は、1,2,3だけに絞って説明して行きたいと思います。
前回、記せていませんでしたが、下記のようなコードと比較していました。
#!/usr/bin/perl -l use strict; use warnings; use utf8; print length('あいうえお'); no utf8; print length('あいうえお'); 1;
上記のソースコードを実行すると下記のようになります。これは、私が期待していた結果です。
azurestone@nsa01:~/tmp/perl/use_utf8$ ./utf805.pl 5 15 azurestone@nsa01:~/tmp/perl/use_utf8$
次は、昨日の問題のコードです。
#!/usr/bin/perl -l use strict; use warnings; use utf8; my $str = 'あいうえお'; print length($str); no utf8; print length($str); 1;
上記のコードを実行すると下記のようになります。昨日と全く一緒です。
azurestone@nist01:~/tmp/perl/use_utf8$ ./utf803.pl 5 5 azurestone@nist01:~/tmp/perl/use_utf8$
そこで私は、混乱しているなか情報を整理していきました。
そうすると頭に引っかかっていたことがわかりました。
それは、「なぜ変数に代入するとno utf8;が有効にならないのか?」でした。
これから示す三つのキーワードをしっかり理解出来ている方だと何故動かないかがわかると思います。
逆に今日まで僕は下記の三つを理解出来ていませんでした。
今日(03/31)まで文字列リテラルの定義を間違えていました。
つまり変数は、変数であって文字列リテラルではないということです。
そしてuse utf8;は、文字列リテラルでASCII文字以外の文字にutf8 flagをつける。
そしてutf8 flagがついていれば、length()は、バイトコードではなくUnicodeのコードポイントとして扱う。
といったところでした。
最後にですが、自分で問題解決できなかったのは、昨日自分で参考していたWebサイトをよく読んでなかったからです。なんとなくutf8プラグマを有効すれば、バイトコードではなく文字列で扱ってくれるとしか思っていなかったからです。もっとしっかりドキュメントを読むべきだったのです。
utf8プラグマの話をすると長くなってしまうので今日は、省略します。調べていてわかったことは、もしかして私は通過儀礼を受けたのではないかと思いました。調べれば調べるほど情報がたくさんでてきます。しかも落ち着いて限定した情報だけをじっくり読めば、ものの5時間でPerlでUnicodeを扱うにはどうすればよいかが理解できるということも身を持って体験した今日この頃です。orz.....
日付が代わり世間は、もっぱらエイプリルフールムードですが、教えて頂いた方に失礼になるので真面目に書いてみました。本当に教えてくれてありがとう!!(;^_^A アセアセ…