camel

これ、Perl 5 Porterとしてちょっと申し訳ないケース。

[を] Perl 標準入力と utf8
しかし、
    test.pl < utf8.txt
は行けるが、
    test.pl utf8.txt
はだめ。

ここで問題になっているのは、<>でファイルを指定した場合も標準入力の場合のどちらの場合もPerlIO Layerを指定する方法。

先に答を書いてしまうと、

use open ':utf8';
binmode STDIN, ':utf8';
binmode STDOUT, ':utf8';

ということになる。

odz buffer - それ use open
とりあえず
use open IN => ':utf8';
とするほうが、スマートといえばスマートか?

やってみればわかるけど、残念ながらこれだけでは標準入力の場合がNG。なぜならuse openはこれからopenするものに関しては働くけど、すでにopenされているSTDINSTDOUTには働かないから。

理念から行くと、

binmode ARGV, ':utf8';

で行くのが理想なのだが、これも残念ながらうまく行かない。use warningsな状態で

binmode() on unopened filehandle ARGV

とwarningが出てしまう。

あと、コマンドラインオプションで、-CIOをつけるという手があるが

perl -CIO ...

はOKでも

#!/usr/bin/perl -CIO

はうまく行かない。-Cに関してはperldoc perlrunを参照のこと。

Dan the Perl 5 Porter