Perlプログラムをコンパクトに記述する方法

文:Nick Gibson(Builder AU) 翻訳校正:村上雅章・野崎裕子
2007-12-25 08:00:00
Perlでは、特殊な変数やファイルハンドルを活用することで、コンパクトなプログラムを記述することができる。今回は、簡単な例を挙げてそういった方法を紹介している。
最新特集【一覧】

特殊ファイルハンドル: <>


 変数にデフォルト変数があるように、ファイルハンドルにも<>という特殊ファイルハンドルがある。これは、プログラムの記述を容易にするためにPerlに追加された略記法である。この特殊ファイルハンドルはすべてのコマンドライン引数をファイル名として扱い、それらを順番にオープンしていく。コマンドライン引数がない場合には、STDINをオープンして読み込む。"-"がコマンドライン引数として与えられた場合、UNIXの慣習と同様に、ファイルの代わりにSTDINをオープンする。このため、上記のプログラムでコマンドラインからのファイルを扱えるようにしたければ、以下のように記述するだけでよい。

print <>;

 たったの8文字で実際に動作するcatの実装を記述できるということを考えた場合、なぜPerlがとてもパワフルであると言われているかが判るはずだ。しかし、単に画面に出力するだけではなく、入力を用いてより複雑なことを行いたい場合にはどうすればよいのだろうか?

行番号を数える


 入力行を個別に処理したい場合、ファイルハンドルを出力に引き渡すだけでは不十分である。ここで、入力した行に行番号を追加する簡単なプログラムを見てみることにしよう。

$num = 0;
while (<>) {
    $num = $num + 1;
    print "$num\t$_";
}

 この例では、行番号を管理するために$numという変数を使用している。各入力行に対してこの値を1ずつ増加させ、その値と入力行を1行にまとめて出力している。二重引用符(")で囲まれた文字列内に変数名称を記述すると、その変数名称が該当変数の内容で置き換えられるため、Perlでは簡単にフォーマット出力が行えるようになっている。

 こういった簡単なプログラムでも、特殊変数のおかげでプログラムがいかにより小さく、より迅速に記述できるようになっているのかが簡単に見て取れるだろう。興味のある方は、Perlマニュアルのperlvarセクション(http://perldoc.perl.org/perlvar.html)で特殊変数についての詳細を調べてみてほしい。

この記事は海外CNET Networks発のニュースをシーネットネットワークスジャパン編集部が日本向けに編集したものです。海外CNET Networksの記事へ

  • コメント(2件)
#1 大野晋一   2007-12-25 14:06:14
とはいえ、こういうコードをある程度の規模のプロジェクトで使っていると、まわりの人がつらいですよね……
#2 Murakami   2007-12-29 09:58:30
ちゃんとした開発(多人数で行う開発や保守を考慮した開発)を行う際には、こういったコードを記述するべきではないでしょうね。

Perlを生み出したLarry Wall氏は「プログラマの三大美徳とは短気、無精、傲慢だ」と主張していましたから、そういった美徳(?)をサポートするためにこういった省略記法が生み出されたのだと考えています。 要はLarry Wall的使用方法、つまりガリガリとスクリプトを書いて実行後、結果が出たらそのスクリプトは捨ててしまう(必要なのは結果だけ)という「ハッカー的使用法」を行う場合にのみおすすめできる書き方なんだと思います。 ちなみに私は「1度書いたものはもったいない」と思ってしまうクチ(ケチ?)なので、省略記法はあまり使っていません。