例題 1テキストファイルの内容を行番号付きで出力するフィルタプログラム cat_n.pl を作りなさい.
(実行例)ここでは,テキストファイルをコマンドライン引数,
標準入力のいずれのかたちで与えても出力が同じでなければならない.
解答例$n = 0; while( $line = <> ){ $n++; print $n, ": ", $line; } 解説(1)基本イメージまず,基本イメージとして,Perl 言語での構文は C 言語に非常に似ている と考えてもらいたい. 細かい違いはあるが,上述の例でいえば,代入や演算,while 文は C 言語と同じである.
(2)変数
また,「型がない」というと戸惑うかもしれないが, Perl では 状況に応じて数字としても文字列としても解釈 してくれる. 例えば, $x = "100";とすると,これは文字列 "100" であるが, $x++;が実行できてしまい,しかも内容はしっかりと "101" になってくれる. つまり,変数に対する演算から状況が自動的に判断され, その変数の内容を数値と見なすか,文字列と見なすかが決定される. (※ C 言語の場合,atoi といった関数により文字列→数値変換が必須である.)
(3)ダイヤモンド演算子 <>
$line = <>というものがある. これは, 入力ファイルから変数 line へ一行分の文字列をまるごと代入する という働きを持つ. そして,ファイルの終りまでを読込むと line が空っぽになり,while 文も終了する. つまり, while ( $line = <> ){ ... }というのは,テキストファイルの内容を一行ずつ読込む という場合の定番のコードになっている.
ここで特筆すべき点として,
<> はコマンドライン引数と標準入力の両方に対応している
という特長がある.
なお,明示的に標準入力を指定したい場合は <STDIN> が利用できる.
(4)print 文
print "$n: $line";と書いてもよい. ちなみに C 言語と同じように printf 文も用意されている. |