昨日から、最近のPerl是非論を受けて(ぼくは誰が何をどう使おうと「どー・でも・いー!」立場ではあるが)ぼくにとってPerlがなぜ好ましいのかをこのさい考えてみようということで書いている。
昨日はPerlとぼくの出会いを書いた。
昨日のまとめは以下の通り。

 ・15年前に急にUNIXな会社に就職した
 ・awk、sed、shを組み合わせた昔ながらのツールに嫌気がさしていた
 ・偶然読んだ「はじめてのPerl」(リャマ本)に、まさにそのやり方の代替としてのPerlについて書かれていて感動を受けた
 ・それ以来Perlを使っている
 ・とりあえずPerlはなんでもできる」から手放せない

だが、なんでも出来るから、というだけでは、好きになる理由としては消極的な気がする。

どんな言語であれ、頑張れば何でも出来る。
Perlは、頑張らなくても何でも出来る。
というか、頑張らないことにここまで心血を注いでいる言語も珍しい。
「手を抜くためならどんなに頑張ってもいい」という矛盾した心情が見られる。

まず、とりあえずなんでも異常に短く書ける。
よくあるPerlのプログラムの例として、以下のようなものがある。

・引数で与えたファイルを標準出力に印字する

普通に書けばこうなる。

 #! /bin/perl
 # fileCopy.pl -- 引数で与えたファイルを標準出力に印字する
 
 $in = shift;
 open IN, $in or die "cannot open $in because $!";
 while (<IN>) {
  print;
 }
 close IN;

この時点で十分短いという気がするが、ダイアモンド演算子というものを使えば入力ファイルが自動的に指定できる。


 #! /bin/perl
 # fileCopy.pl -- 引数で与えたファイルを標準出力に印字する
 
 while (<>) {
  print;
 }

でもたった1つだけの文だったらwhileは構造がいらない。

 #! /bin/perl
 # fileCopy.pl -- 引数で与えたファイルを標準出力に印字する
 
 print while <>;

でも<>はリスト コンテクストで解釈すればファイルの中身に展開してくれる。

 #! /bin/perl
 # fileCopy.pl -- 引数で与えたファイルを標準出力に印字する
 
 print <>;

これだけで立派なプログラムになるのである。
こういう風にむきになってプログラムを短縮する遊びをコード ゴルフと言う。
それにしても、「print <>」ってなんの冗談だろうか。
ちなみに、ファイルの中身をソートするのならこう書ける。

 #! /bin/perl
 # fileSort.pl -- 引数で与えたファイルを(辞書順に)ソートしてから標準出力に印字する
 
 print sort <>;

ファイルの中身を逆順にして印字するならこうする。

 #! /bin/perl
 # fileReverse.pl -- 引数で与えたファイルを標準出力に逆順に印字する
 
 print reverse <>;

では逆順にソートするにはどうすればいいだろうか。
ハイみなさんご一緒に。

 #! /bin/perl
 # reverseSort.pl -- 引数で与えたファイルを(辞書の逆順に)ソートしてから標準出力に印字する
 
 print reverse sort <>;

これでオッケーである。

1から100まで数字を表示するにはどうすればいいだろうか。
普通にC言語っぽくこう書くことも可能である。

 #! /bin/perl
 # count100.pl -- 100まで数える
 
 for ($i = 1; $i <= 100, ++$i) {
  print $i, "\n";
 }

でもこうも書ける。

 #! /bin/perl
 # count100.pl -- 100まで数える
 
 for $i (1 .. 100) {
  print $i, "\n";
 }

これは強烈に書きやすい。
何を書いているか一発で分かる。
なお、50から200だとこう書ける。

 #! /bin/perl
 # count50to200.pl -- 50から200まで数える
 
 for $i (50 .. 200) {
  print $i, "\n";
 }

すごいのが'a'から'z'までの文字配列(a, b, c, d ... z)をこう書けるということだ。

 #! /bin/perl
 # sayAlphabet.pl -- 'a'から'z'まで表示する
 
 for $c ('a' .. 'z') {
  print $c, "\n";
 }

next、lastという制御文も大好きだ。
以下はwhileを使った数を数えるプログラムの別解である。

 #! /bin/perl
 # count100.pl -- 100まで数える
 
 $i = 0;
 while (++$i) {
  print $i, "\n";
  last if $i == 100; # $iが100になったらループを終了する
 }

lastは再内のループから脱出する制御文だ。

これを使えば本当にgotoがいらなくなる。
普通のプログラミング言語でgotoをなくそうとするとストレスがたまる。
「gotoを書いた方が明らかにラクで論理的」な局面があるのだ。
しかしPerlは制御文がリッチなので、gotoを使いたいとそもそも思わなくなる。

nextはループの次の周回まで飛ぶ制御文である。

 #! /bin/perl
 # count100.pl -- 100までの偶数を数える
 
 $i = 0;
 while (++$i) {
  next if $i % 2 != 0; # $i が奇数の場合は次の周回に移動する
  print $i, "\n";
  last if $i == 100;
 }

「<>」、「..」、「next」、「last」を使っていて思うのは、手間が省けてありがたいというだけではなく、どこかユーモラスで楽しいということである。
覚え始めの頃は、マジ楽しくてクスクス笑いながらプログラミングしていた。

Perlは読みにくい、という説があるけど本当だろうか。
書き方が自由なので、いくらでも読みにくく書ける。
でも、その気になれば読みやすくも書ける。
なんだったら詩も書けるのである。
ラクダ本には数々のPerl詩の大作が入っているが、ここではPerlハイクを1句引用する。
何の意味もないがコンパイル エラーは出ないそうだ。

 study, write, study,
 do review (each word) if time.
 close book. sleep? what's that?


「コンピューターのソフトが面白い」、「入門書が楽しい」というのはまだ分かるけど、「プログラム言語の仕様が楽しい」なんてことがあるんだろうか。
ある。
ぼくはとりあえずPerlでそれを知った。

別に仕事なんか楽しくなくてもいいじゃないか。
仕事なんだから、苦しくても、真面目に、頑張ってやるべきじゃないだろうか。
そういう人は、楽な仕事しかしてないんだと思う。
修羅場をくぐっていて、本当にきつい仕事にあえいでいるときは、ちょっとでも仕事が楽しいとありがたい。
仕事こそ楽しくあるべきだと思うのだ。

Subscribe with livedoor Reader
Add to Google
RSS
このエントリーをはてなブックマークに追加