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

Perlサンプル2 文字入力

2019-08-19

キーボードから入力を受け付けて表示します。

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

my $howtoterm = "MSWin32" eq $^O ? "CTRL+zと改行で終了" : "CTRL-dで終了";
say "自分の好きな者を入力してください($howtoterm)";

my $count = 0;
while (<>) {
	chomp;

	$count++;
	my $wa = $count % 2 ? "は" : "も";
	say "$_${wa}俺の嫁";
}

Windowsの実行結果です。 Linuxは「CTRL+dで終了」です。

自分の好きな者を入力してください(CTRL+zと改行で終了)
たこルカ
たこルカは俺の嫁
ルカ姐さん
ルカ姐さんも俺の嫁
結月ゆかり
結月ゆかりは俺の嫁
ミクダヨー
ミクダヨーも俺の嫁
^Z

$^O

「この Perl が構築されたオペレーティングシステムの名前です」
「Windows プラットフォームでは、$^O はあまり役に立ちません: これは常に MSWin32 となり、95/98/ME/NT/2000/XP/CE/.NET の違いを示していないからです。」
Perlの組み込み変数 $^O の翻訳 - perldoc.jp

<>

入力した文字を1行ごとに取り出します。 入力が終わる(CTRL+zと改行、又は、CTRL+d)とwhileループが終了します。 入力行は改行も含めて$_に入ります。 この改行は、OSに依存する改行(例えばWindowsなら0x0d, 0x0a、Linuxなら0x0a)からPerlの改行(0x0a)に変換されています。
「I/O 演算子」
「<> からの入力は、標準入力からか、コマンドライン上に並べられた個々の ファイルから行なわれます。」
「この入力シンボルが、while 文(for(;;) の形になっていたとしても)の条件式中に 単独で現れた場合だけは、その値が自動的にグローバル変数 $_ に代入されます」
perlop - Perl の演算子と優先順位 - perldoc.jp

chomp

$_の末尾にある改行を削除します。
「入力レコードから、改行を削除したいのだけれど、最後のレコードには改行が 入っているのかわからないような場合に、使用できます。」
「VARIABLE が省略されると、$_ を対象として chomp します。」
Perlの組み込み関数 chomp の翻訳 - perldoc.jp

"$_${wa}俺の嫁"

変数$_と$waをダブルクォーテーションのリテラル文字列の中に入れると展開します。 但し変数名に漢字も使えるので"$_$wa俺の嫁"では変数名が「$wa俺の嫁」になり未定義の変数を展開したと警告されます。 $waは${wa}と書けますから"$_${wa}俺の嫁"で$waが展開されます。
「クォートとクォート風の演算子」
perlop - Perl の演算子と優先順位 - perldoc.jp