まくまくPerlノート
標準入力を読み込む (STDIN)
2008-03-09

STDIN からの読み込み

標準入力ストリーム (standard input stream) から行を読み込むには、行入力演算子の <STDIN> を使います。

行入力演算子をスカラーコンテキストで評価すると、次の 1 行を返し、リストコンテキストで評価すると、すべての行をリストで返します。これ以上読み込む行がない場合は undef を返します。

my $line = <STDIN>;   # 標準入力から次の行を読み込む
my @lines = <STDIN>;  # 標準入力からすべての行を読み込む

改行コードの削除

行入力演算子からの入力には、改行が含まれています。 行末の改行コードを消したいときは、chomp を組み合わせて使用します。

chomp($line);   // 末尾の改行コードを取り除く
chomp(@lines);  // 各行の末尾の改行コードを取り除く

STDIN からの読み込みと同時に改行コードを取り除いてしまうこともできます。

chomp(my $line = <STDIN>);
chomp(my @lines = <STDIN>);

STDIN を一行ずつ読み込みながら処理する

行入力演算子を while ループで使用すると、すべての行を 1 行ずつ読み込んで処理することができます(while の条件部はスカラーコンテキストで評価されるので 1 行ずつ読み込むという動作になる)。

while (<STDIN>) {
    print;  # $_ を出力
}

この書き方は、下記のような記述のショートカットになっています。

while (defined($_ = <STDIN>)) {
    print $_;
}

while ループで行入力演算子を使用する場合は、行の読み込みと同時に chomp することができないので、行末の改行を取り除きたい場合は次のように単独で chomp を実行する必要があります。

while (<STDIN>) {
    chomp;  # $_ の行末の改行を削除
    print;  # $_ を出力
}

foreach (for) ループでも似たようなことができますが、foreach (for) はリストを要求する(リストコンテキストで評価する)ため、最初に行入力演算子からすべての行を読み込んでから、ループ処理が行われます。

# 1 度にすべての行を読み込んでからループ処理。
# メモリを大量に消費するかも。
for (<STDIN>) {
    print;
}
2008-03-09