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

Perlサンプル3 引数の読み取り

2019-08-22

内容

起動時の引数を読み取ります。 実行するにはEncode::Argvが必要(ないとコンパイルエラーで実行不可)。 文字化けをなくすにはTerm::Encodingのインストールが必要(ないと文字化け)。

コード

#!/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;

say "引数の個数 @{[scalar @ARGV]}";
say "-----";
say for @ARGV;
say "-----";

実行結果

引数が「たこルカ は 俺の嫁 ルカ姐さん も 俺の嫁」の場合です。

引数の個数 6
-----
たこルカ
は
俺の嫁
ルカ姐さん
も
俺の嫁
-----

解説

use Encode::Argv

Encode::Localeの引数版です。 useしておくだけで引数@ARGVの文字コードを環境に合わせてデコードしてくれます。 Windowsの引数はcp932、Linuxの引数はutf-8で、どちらもデコードします。 perlのプログラムが扱う文字コードはutf-8でないutf-8に似た何かですからきちんとデコードしましょう。
Encode::Argv - Automatically Mess With @ARGV's Encoding - metacpan.org

scalar

スカラコンテキストで評価した@ARGVは要素の個数です。 引数は「たこルカ は 俺の嫁 ルカ姐さん も 俺の嫁」ですから6です。
「EXPR を強制的にスカラコンテキストで解釈されるようにして、 EXPR の値を返します。」
Perlの組み込み関数 scalar の翻訳 - perldoc.jp

[~]

スカラを[]で囲んだものは要素1個の配列のリファレンスです。引数の個数は6ですから、(6)のリファレンスです。
「リファレンスを作る」
「名前の無い配列へのリファレンスは、大かっこを使って作ることができます」
perlref - Perlのリファレンスとネストしたデータ構造 - perldoc.jp

@{~}

配列にデリファレンスします。 [6]をデリファレンスすると(6)になります。 ダブルクォーテーションの中にあると全ての要素をスペースで区切って並びます。 要素が1個なのでダブルクォーテーションの中は6になります。 リファレンスとデリファレンスの話は面倒くさいので公式ページをよく読んでください。
perlreftut - Mark によるリファレンスに関するとても短いチュートリアル - perldoc.jp

for

左の単純文を配列の要素1個につき1回実行します。 このとき要素のエイリアスが$_に入っています。 $_を変えると要素も変わります。 参考のため、ほぐして書くとこうなりますが不必要な変数が増えて把握しにくいのでお勧めしません。


for my $item (@ARGV) {
	say $item;
}

「文修飾子」
「任意の単純文には、一つ の修飾子を終端のセミコロンの直前(もしくは ブロックの終端の直前)に付けることができます。」
「for LIST」
perlsyn - Perl の文法 - perldoc.jp

say

sayのリストを省略すると$_を表示します。 $_は修飾子のforが要素のエイリアスを設定します。
Perlの組み込み関数 say の翻訳 - perldoc.jp