ルモーリン
ホーム 更新 Perl Sample サービス 雑談 鉄ゲタ Linux リンク 連絡先

Perlサンプル6 ファイルの書き出し

2019-08-26

内容

漢字入りファイル名のファイルに漢字を書き出します。

コード

#!/usr/bin/env perl

use v5.26;
use utf8;
use strict;
use warnings;

use Encode::Argv;
use Encode::Locale;

use open IO => ":utf8";
binmode STDIN, ":encoding(console_in)";
binmode STDOUT, ":encoding(console_out)";

$| = 1;

use constant FILENAME => "perlsample_006_俺の嫁.txt";
if (open my $fh, ">:unix:utf8", Encode::encode locale_fs => FILENAME) {
	say $fh "たこルカは俺の嫁";
	say $fh "ルカ姐さんも俺の嫁";
	close $fh;
	say "ファイルを書き出しました:" . FILENAME;
} else {
	say "ファイルを開けませんでした:$!";
}

実行結果

ファイルを書き出しました:perlsample_006_俺の嫁.txt

ファイルの中身です。 改行が0x0aなのでWindowsのメモ帳では1行に表示されます。

たこルカは俺の嫁
ルカ姐さんも俺の嫁

解説

use constant

「定数を式で使ったとき、Perl はこれをコンパイル時に値に置き換え、それから さらに式を最適化します。 特に、if (CONSTANT) ブロックにあるコードは、定数が偽の時には最適化されて なくなります。」
constant - 定数を宣言するための Perl プラグマ - perldoc.jp

">:unix:utf8"

ファイル出力、改行は0x0a、文字コードはUTF-8を指定します。 オプションを指定した事で「use open IO => ":utf8"」の:utf8が無効になっていますから、改めて:utf8を指定することに注意してください。 前後を入れ替えて">:utf8:unix"で漢字を出力すると警告が出ます。 改行を0x0d、0x0aにしたい場合は">:crlf:utf8"としてください。 何故か">:utf8:crlf"でも動作します。

say $fh "たこルカは俺の嫁"

「say FILEHANDLE LIST」
Perlの組み込み関数 say の翻訳 - perldoc.jp