* ファイル操作 [#h015ba54]
** ファイルを開く [#if477b8a]
- use openで指定するか、3つの引数を取るopen()を使うか。
- use openで指定した時は、必ず2つの引数のopen()を使う。でないと、上書きされる。
*** use open [#re5f9518]
use open IN => ':utf8';
open my $in, '<utf.txt' or die;
use open IN => ':encoding(euc-jp)';
open my $in, '<euc.txt' or die;
*** 3つの引数を取るopen() [#x38bb27f]
open IN, "<:encoding(euc-jp)", "euc.txt";
open IN, "<:utf8", "utf.txt";
** ファイルに書き出す [#a2d214c4]
- 書き出す文字列($text)はUTF8フラグを落としていないと、Perlがwarningを出す。
-(ただし、ファイルにはUTFな文字列がちゃんと書き込まれている。)
- 従って、UTFで出力したい場合でも、下のいずれかの方法でUTFフラグを落としてやる必要がある。
- 書き出す文字列にUTF8フラグがない場合は、何もする必要はない。
*** use open [#ea73e06a]
use open OUT => ':encoding(shift_jis)';
open my $out, '>sjis.txt' or die;
print $out $text;
*** 3つの引数を取るopen() [#b53355bc]
open my $out, '>:encoding(shift_jis)', 'sjis.txt' or die;
print $out $text;
** すでに開かれているファイルハンドル(STDIN/STDOUTを含む)にPerlIOレイヤを指定する(binmode)[#ddc083be]
すでに開かれているファイルハンドル(STDIN/STDOUTを含む)にPerlIOレイヤを指定する。ファイルハンドルレベルでuft8フラグを付けたり落としたり、文字コードを変換する。
*** use UTF8なスクリプト内で標準入力(出力)を使う [#a6154bd5]
use utf8;
binmode STDOUT, ':utf8'; # 'encoding(utf8)'でもよい
print "あ 京\n";
↑binmodeを使わなければ「Wide character」のシステムエラーが発生する。
use utf8;
binmode STDIN, ':utf8';
while (<>) {
chomp;
print "[$_]\n";
}
*** use utf8なスクリプト内で、SJISのテキストファイルを読取り、標準出力へ表示する [#q64d8f9e]
use utf8;
binmode STDOUT, ':encoding(utf8)';
open my $fh, '<', shift;
binmode $fh, ':encoding(sjis)';
while ($row = <$fh>) {
print $row;
}
close $fh;