Continue(s)

Twitter:@dn0t_ GitHub:@ogrew

use utf8;とはなんたるやを知る。

目的

use utf8;

Perlで文字列を扱うときに書くこいつの意味をしっかりと理解したい。

まずは適当にググる

Perlの文字列の扱い方・・其の壱

ちょっと古い記事だけど…。
なるほど、内部文字列と外部文字列でのutf8フラグ管理に使われるものなのか(?)

…待て待て、認識が怪しい。
てか、「プラグマ」ってのもイマイチわかってないゾ。
ってことで話は脱線して「プラグマ」についてまず調べる。

Perlのプラグマについて調べてみた

Perlコンパイラの動作を変更するモジュール

Perl のプラグマモジュールの作り方

strict.pm や warnings.pm のようにレキシカルスコープで振る舞いを変更するモジュール

perldoc.perl.orgにプラグマの一覧(?)っぽいのが乗っていた。
http://perldoc.perl.org/index-pragmas.html

なるほど。
そのPerlのソース自体をコンパイルする際に挙動だったり影響だったりを与えるモジュールのことをどうやら指すっぽい。

そしてutf8プラグマは最初の記事にもあるように、レキシカルスコープ内の文字列を内部文字列として扱うものであり、対するbytesプラグマは外部文字列として扱うもののようだ。

(ということはutf8プラグマはutf8フラグを管理するものであって、utf8バイナリとは直接関係するものではないということだ。)

…なので次のような内部文字列をそのまま出力するようなコードは警告が出る。

test_utf8.pl
use utf8;

my $hoge = "どうぶつの森";
print "length: " . length($hoge) . "\n";
print $hoge;

【出力結果】

> $ perl test_utf8.pl
length: 6        <- use utf8;を抜かすとバイト数で出るので18となる
Wide character in print at test_utf8.pl line 5.
どうぶつの森

 また一つ日々の疑問が解決した。
とりあえず、 use utf8; は書いておいておくに越したことはなさそう。
まず文字列をそのまま出力するようなもの書かないし。

他に参考になったサイト。