2.0 1行だけの 入力 と 出力

Unix の標準入力から入力するには < > を用います。標準入力 と 標準出力は Unix の 言葉で、keyboard からの 入力 と kterm への 出力 と考えていてください。
(例題 2.0) 標準入力から 1 行読んで それを 標準出力に表示します。(p2-0.pl)
#!/usr/local/bin/perl
$a = <>;         # 標準入力から 1 行読み 変数 $a に代入します。
print $a;        # $a を印刷します。

ここで $a は 文字変数です。p2-0.pl を save し実行します。
soot12% chmod +x p2-0.pl     <== 実行可能にします。
soot13% p2-0.pl              <== 実行します。
test                         <== 標準入力 から test といれます。
test                         <== 標準出力 に test と表示されました。
soot14%

注: test の後に改行されず、testsoot14% のようになる場合 もあります。そのときは、print $a,"\n"; と改行 (\n) も "" で 挟んで印刷してみてください。"\n" でなく '\n' だと \n をそのまま 印刷されてしまいますので、"" で挟んでくださいね。

2.1 複数行の 入力 と 出力

入力がなくなるまで繰り返し入力をして作業するには、while(< >) { すること; } を用います。{ すること; } のところに入力 がなくなるまで繰り返し作業する内容をかきます。ちなみに {...} のあとには ; は不要です。
(例題 2.1) 標準入力から入力がなくなるまで1 行づつ読んで それ を 標準出力に表示します。(p2-1.pl)
#!/usr/local/bin/perl
while(<>) {      # 標準入力から入力がなくなるまで { 以下のことをせよ。
print;           # 入力の内容を印刷します。
}                # } の終了

p2-1.pl を実行してみるとわかりますが、入力をすると同じものが 印刷されます。「入力が終了」するためには、C-d (EOF, End of File) を 入力します。file の 終りには EOF が ついています。

キーボード入力の代わりに file として、p2-1.dat という file を つくってそこに、適当な内容を書き込みます。標準入力かわりに、 Unix の リダイレクション を使って、

% p2-1.pl < p2-1.dat

とすると、キーボード入力の代わりに p2-1.dat の内容を入力して、出力します。

2.2 暗黙の変数 $_

p2-1.pl で print; として、print するものがなにも書いていないのに、 出力されるのが不思議に感じられた人は、なかなか鋭いです。

Perl では、暗黙の変数 $_ というものが使われます。ここで print; とは暗黙の変数を印刷する、即ち print $_; のことなので す。では $_ がどこで設定されるかというと、p2-1.pl の場合には while(<>) で 入力が存在した場合に、while で $_ が設定される のです。while(<>) を 省略しないで書くと、while($_ = <>) ( 標 準入力 <> を $_ に代入することが真(代入できる) である限り) になります。

他動詞となるコマンド (print, shift 等) で 目的語となる 変数 がない場合には、常に暗黙の変数 $_ があると理解して下さい。な れてくると、通常の言葉( 例えば「買ってきました。」とか、「印 刷しています。」) と同じで省略した方が便利な場合が多いです。


(課題 2.2) p2-1.pl で 暗黙の変数をいれて、同じ様に動作することを確認せよ。