
[1]
[[Perl]] 5.8以降では[CODE(perl)@en[[[open]]]]で[[文字列]]を[[ファイルハンドル]]にすることができます。
(それ以前では[CODE(perl)@en[[[IO::String]]]]で同じことが実現できます。)

[PRE(perl example code)[
my $string = q<... some string ...>;
open my $fh, '<:utf8', \$string;
]PRE]

[[PerlIO]][[層]]として[CODE(perl)@en[:[[utf8]]]]を指定しておくことで、[[utf8]][[旗]]付きの[[文字列]]を扱うことができます。
(例えば[CODE(perl example)@en[$fh->[[getc]]]]で、
[[非ASCII文字]]を[[文字]]として順に得られます。)

([[名無しさん]])

[2]
[[Perl]] 5.8.7 for [[Linux]]と5.8.4 for [[Windows XP]]で試したところでは、[[改行]]を勝手に変更してくれることはないようです。
([[名無しさん]])

[3]
[CODE(perl)@en[:[[utf8]]]]としておけば[[utf8]][[旗]]付き[[文字列]]と[[ASCII]][[文字列]]は[[文字列]]として扱われますが、
[CODE(char)@en[[[U+0100]]]]以上の[[文字]]が1[[文字]]も含まれていない[[ISO/IEC 8859]][[文字列]]になっている時に[CODE(perl)@en[:[[utf8]]]]がついていると、不正な[[UTF-8]][[文字]]があると言われてしまいます。

かといって[CODE(perl)@en[:[[utf8]]]]を付けないと常に[[バイト列]]扱いになってしまいますし。。。

仕方が無いので[CODE(perl)@en[[[utf8]]:[[is_utf8]]]]で場合分けすることにします。。。
([[名無しさん]])

[4]
[CODE(perl)@en[[[open]]]]の第1引数に[[変数]]を指定した場合、
その[[変数]]は[CODE(perl)@en[[[IO::Handle]]]][[オブジェクト]]になりますから、
[CODE(perl)@en[[[IO::Handle]]]]で定義されている[[メソッド]]が使えます。
[PRE(perl example code)[
my $ch = $fh->getc;
]PRE]

のように[[オブジェクト指向]]な書き方ができます。ただし、明示的に
[PRE(perl example code)[
[[require]] [[IO::Handle]];
]PRE]

とでもしておかないといけません。

([[名無しさん]])


[8]
>>3 [CODE(perl)@en[:[[utf8]]]] ではなく [CODE(perl)@en[:[[encoding]]([[utf8]])]] を使うとよさげです。
多少パフォーマンスは落ちるかもですが。。。
