ルモーリン
ホーム 更新 Perl Sample ランドナー サービス 雑談 コースガイド 鉄ゲタ 自転車 Linux リンク 連絡先

WindowsとCentOSで両用できるPerlの書き方

2019-02-21

背景

WindowsでPerlを使おうとして(例えばActivePerl)、ブログとかのLinux下のPerlスクリプトをコピペして爆死、原因を調べようにもWindows下との違いを書いたブログなどを見つけられずに玉砕されている人達が結構いらっしゃるようなので。

スクリプトの頭、文字コード、改行コード

今時のPerlなら、スクリプトの頭はこんな感じですよね。 ファイルの文字コードはBOMなしのUTF-8です。 改行コードは愛用のエディタに合わせておけば良いと思います。 私はVimを使っているので設定次第ですからLinux風に0x0aにしています。 なおメモ帳で開くと改行してくれません(笑)。
#!/usr/local/bin/perl -w

use utf8;
use strict;
use warnings;
use Encode;

標準入力、標準出力、標準エラー出力

実行時の環境に合わせ、端末とプログラムの文字コードを変換してくれます。 ちなみにプログラムが扱う文字コードは「謎の文字コードX」だと思ってください。 ブログとか知恵袋で「Perlの内部はUTF-8」などと言うのを真に受けると爆死します(笑)。 2018-07-17 encodeをencodingに修正しました。 2019-02-21 ソースファイルのパスに漢字があるとフリーズするケースがあるので「binmode STDERR, ":encoding(console_out)";」を削除しました。
use Encode::Locale;
binmode STDIN, ":encoding(console_in)";
binmode STDOUT, ":encoding(console_out)";

引数の文字コード

引数も環境に合わせて変換してくれます。
use Encode::Argv;

ファイルの中の文字コード

文字コードをUTF-8で統一します。 あれ、改行コードどうだっけ?
use open IO => ":utf8";

ファイル名の文字コード

Windows下のPerlはファイル名の文字コードをcp932(マイクロソフトのシフトJISっぽい奴)で扱います。 UNICODEにしかない漢字を使ったファイル名を開けません。
my $filename = "漢字入りファイル名.txt";
if (open my $fh, ">", Encode::encode locale_fs => $filename) {
	print $fh "ファイルの中に\n";
	print $fh "漢字が入るよ♪\n";
	close $fh;
}