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

Perlサンプル1 文字表示

2019-08-18

内容

とりあえず2行出します。 2行出すのに前置きが10行かかるという(笑)。 Perl5.26以降限定、WindowsでもLinuxでも動作します(ここ重要)。 パッケージEncode::Localeのインストールが必要です。 1行目はLinuxのperlbrew用の書き方でWindowsは動作に影響しません(多分)。

コード

#!/usr/bin/env perl

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

use Encode::Locale;

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

$| = 1;

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

実行結果

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

解説

perlbrew

1行目の「#!/usr/bin/env perl」はperlbrewを使う場合の書き方です。
Perlbrew

use v5.26

「特に use VERSION の形式では、VERSION は 5.006 のような正の 10 進小数 ($] と比較されます)か、v5.6.1 の形 ($^V (またの名を $PERL_VERSION) と比較されます) の v-文字列で指定します。 VERSION が Perl の現在のバージョンより大きいと、例外が発生します; Perl はファイルの残りを読み込みません。 require と似ていますが、これは実行時にチェックされます。 対称的に、no VERSION は指定されたバージョンより古いバージョンの Perl で 動作させたいことを意味します。」
Perlの組み込み関数 use の翻訳 - perldoc.jp

use utf8

「Perl に script が UTF-8 で書かれているということを教える目的以外で このプラグマをつかってはいけません。」
utf8 - ソースコード内に、UTF-8(か、UTF-EBCDIC)を有効/無効にするためのプラグマ - perldoc.jp

use strict

strict - 安全ではない構文を制限する Perl プラグマ - perldoc.jp

use warnings

warnings - 選択的な警告を調整する Perl プラグマ - perldoc.jp

use Encode::Locale

console_in、console_out(コンソール入出力の文字コード)、console_fs(ファイル名の文字コード)といった抽象的な識別子を定義して 文字コードを決めるモジュールです。 Windowsは"cp932" eq console_out、Linuxは"utf8" eq console_outになるため、 文字列表示で文字コードを指定する際にconsole_outと指定すればWindows/Linuxで共用できます。
Encode::Locale - Determine the locale encoding - metacpan.org
インストールが必要です。 cpanm Encode::Localeでインストールできますがcpanmもインストールが必要です。 cpanmはperlbrew install-cpanmでインストールできます。
cpanm - get, unpack build and install modules from CPAN - metacpan.org

use open IO => ":utf8"

開くファイルの文字コードのデフォルトをutf8に設定、オプションなしで開くとutf8として読み込みます。 openのオプションを指定するとデフォルトが全無効になるので文字コードの指定が必要です。よく忘れます(ノД`)
open - 入出力のためのデフォルトの PerlIO 層をセットするための perl プラグマ - perldoc.jp

binmode STDIN, ":encoding(console_in)"

標準入力の文字コードをコンソール入力の文字コードに設定します。 ここでEncode::Localeモジュールが定義したconsole_inを使い、Windows/Linuxで共有できます。
「binmode FILEHANDLE, LAYER 」
「LAYER が存在すると、それは単一の文字列ですが、複数の指示子を 含むことができます。 指示子はファイルハンドルの振る舞いを変更します。 LAYER が存在すると、テキストファイルでの binmode が意味を持ちます。」
Perlの組み込み関数 binmode の翻訳 - perldoc.jp

binmode STDOUT, ":encoding(console_out)"

標準出力の文字コードをコンソール出力の文字コードに設定します。 特に今回のサンプルで文字出力を行っているため、コレがないと正しい文字コードで出力しているという記述になりません。 LinuxでSTDOUTに文字コードを設定しないコードは、偶然文字コードが同じなので偶然動いています。 偶然動いているコードは環境の変化に弱く、ちょっとWindowsで動かすとすぐ文字化けします(´・ω・`)

$| = 1

「0 以外に設定されると、その時点で選択されている出力チャネルを直ちにその場で フラッシュし、さらに write や print を行なうごとに、強制的にフラッシュします。」
Perlの組み込み変数 $| の翻訳 - perldoc.jp

say "たこルカは俺の嫁"

たこルカは俺の嫁です。たこルカ - Google 検索
「print と同様ですが、暗黙に改行が追加されます。」「"say" 機能 は現在のスコープで use v5.10 (またはそれ以上) が宣言されると自動的に有効になります。」
Perlの組み込み関数 say の翻訳 - perldoc.jp

say "ルカ姐さんも俺の嫁"

ルカ姐さんも俺の嫁です。巡音ルカ - Google 検索