第 3 回 - Perl 入門(1)

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

例題 2

テキストファイルを入力として,その内容を出力する Perl スクリプト hcat.pl を作りなさい.
ただし,最後の一行だけは出力しないものとする.

(実行例)

     $ perl hcat.pl foo.c
     #include 
     
     int main(void)
     {
       int N;
       int x, sum;

       scanf("%d", &N);
       printf("N = %d\n", N);
       
       sum = 0;
       for ( x = 1; x <= N; x++ ){
       sum += x;
       }
       
       printf("1 + ... + %d = %d\n", N, sum);
       
       return 0;
※↑最後の一行だけが表示されていない

解答例

     @contents = <>;
     pop(@contents);
     foreach $line (@contents) {
        print $line;
     }
     

解説

(1)配列
Perl では先頭に @ を付けると配列を意味する.
既に説明したように変数の宣言は必要ない.
さらに便利なことに
   @contents = <>;
とすることで,入力の内容が一行ずつ配列に格納される. つまり,配列を用いれば例題 1 のように while 文を使う必要もない (もちろん,すべての内容がメモリに格納されるため,全く同じとはいえない).

なお,配列の内容にアクセスする場合は

   $contents[0]
という具合いに先頭に "$" を末尾に "[添字]" を付ける. 配列の添字は C 言語と同じで 0 から始まる.

(2)配列の先頭/末尾に対する要素の追加・削除
配列の先頭や末尾から要素を削除する場合は shift 及び pop をそれぞれ使う:

  • $a = shift(@array);
    @array の先頭要素が削除され,$a へ代入される.
  • $a = pop(@array);
    @array の末尾要素が削除され,$a へ代入される.
逆に配列の先頭や末尾に要素を追加する場合は unshift 及び push をそれぞれ使う:
  • unshift(@array, 8);
    @array の先頭に要素 8 が挿入される.
  • push(@array, "abc");
    @array の末尾に要素 "abc" が追加される.

(3)foreach
配列の要素一つ一つにアクセスする場合,foreach 文を使うと便利である.
直感的にはシェルスクリプトの for 文と同じであり, 繰り返しのたびに配列の内容が一つずつ順番に変数へ代入されていく.


     foreach $変数 (@配列){
        ...
     }

上の解答例でいえば
     foreach $line (@contents) {
        print $line;
     }
であるが,これは配列 contents の要素を順番に変数 line へ代入し, print 文でそれを表示している.