第 3 回 - Perl 入門(1)

[10/12, 2009 H.Aman]
67x27(1669bytes)   67x27(1669bytes) 【課題 1】

例題 1

テキストファイルの内容を行番号付きで出力するフィルタプログラム cat_n.pl を作りなさい.

(実行例)ここでは,テキストファイルをコマンドライン引数, 標準入力のいずれのかたちで与えても出力が同じでなければならない.

     $ perl cat_n.pl foo.c
     1: #include 
     2: 
     ....
     18:   return 0;
     19: }

     $ perl cat_n.pl < foo.c
     1: #include 
     2: 
     ....
     18:   return 0;
     19: }

解答例

     $n = 0;
     while( $line = <> ){
        $n++;
        print $n, ": ", $line;
     }
     

解説

(1)基本イメージ
まず,基本イメージとして,Perl 言語での構文は C 言語に非常に似ている と考えてもらいたい. 細かい違いはあるが,上述の例でいえば,代入や演算,while 文は C 言語と同じである.

(2)変数
次に変数についてであるが,

  • 変数名は必ず $ マークで始まる
  • 変数の宣言は必要ない.
  • 変数に型はない
宣言不要というところが手軽さの一つである.
また,「型がない」というと戸惑うかもしれないが, Perl では 状況に応じて数字としても文字列としても解釈 してくれる. 例えば,
   $x = "100";
とすると,これは文字列 "100" であるが,
   $x++;
が実行できてしまい,しかも内容はしっかりと "101" になってくれる.
つまり,変数に対する演算から状況が自動的に判断され, その変数の内容を数値と見なすか,文字列と見なすかが決定される. (※ C 言語の場合,atoi といった関数により文字列→数値変換が必須である.)

(3)ダイヤモンド演算子 <>
while 文の条件の中に

     $line = <>
というものがある.
これは, 入力ファイルから変数 line へ一行分の文字列をまるごと代入する という働きを持つ. そして,ファイルの終りまでを読込むと line が空っぽになり,while 文も終了する. つまり,
     while ( $line = <> ){
        ...
     }
というのは,テキストファイルの内容を一行ずつ読込む という場合の定番のコードになっている.

ここで特筆すべき点として, <> はコマンドライン引数と標準入力の両方に対応している という特長がある.
正確には,

  1. コマンドライン引数が与えられていれば <> はコマンドライン引数で与えられたファイルの内容
  2. コマンドライン引数が与えられていなければ <> は標準入力の内容
という具合いに自動的に切り替わる. つまり,フィルタプログラムを作る上で非常に便利である.
なお,明示的に標準入力を指定したい場合は <STDIN> が利用できる.

(4)print 文
出力は print 文で実行できる. こちらも変数の型を気にする必要がなく, 出力したい変数や文字列をカンマで区切って列挙すればよい.
なお,ダブルクォーテーションの中ならば変数の内容は先に展開されるため, 上述の例は

   print "$n: $line";
と書いてもよい.

ちなみに C 言語と同じように printf 文も用意されている.