標準入力ストリーム (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>);
行入力演算子を 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;
}