「初めてのPerl」 14章 (プロセス管理)

APOGEEの『Fantastic』を爆音で聴きながらPerlの勉強をしているbonlifeです。いやぁ、このアルバムは凄い。という話はまた後日。「初めてのPerl」の14章は「プロセス管理」。14章の内容はだいたい以下のような感じです。

  • system関数 (子プロセスを起動)
  • exec関数 (Perlプロセス自身がジャンプする感じ)
  • 逆クォートを使った出力の取り込み
  • パイプオープン (プロセスをファイルハンドルとして使う)
  • fork (詳細は別の本で学んで状態)
  • シグナルの送受信

なんだか結構難しいじゃないの。結構OS寄りの低レベルな内容ですね。forkは何度か見たことがある気がするので、次に見かけた時にちゃんと勉強することにして、今回はスルー。そんなこんなで早速練習問題のbonlife的(not 模範)解答例です。
ex14-1.pl

#! perl
use strict;
use warnings;

my $dir = 'C:\test';
chdir $dir or die "Can't chdir to $dir : $!\n";
system "dir";

出力結果は省略。解答例を見て気づいたことは以下の通り。

  • 解答例ではexecを使用 (Perlのプロセスに戻る必要がないので、execなのかしら)
  • execの行にも or die を書いておいた方が良い

手を抜かずにちゃんとLinux立ち上げてやった方が良い気がしてきましたが、もう14章まできちゃったので、意地でWindows上のActivePerlで頑張ります。続いて2問目。
ex14-2.pl

  • 問題1のプログラムを改造して、コマンドの出力をカレントディレクトリの ls.out というファイルに書き出すようにする
  • エラー出力は、 ls.err というファイルに出力する
#! perl
use strict;
use warnings;

my $dir = 'C:\test';
chdir $dir or warn "Can't chdir to $dir : $!\n";
my $dir_list = `(dir > ls.dat) 2> ls.err`;
print $dir_list;

出力結果は省略。解答例を見て気づいたことは以下の通り。

  • 豪快に間違えました (ファイルの出力がカレントディレクトリじゃない!)
  • 出力は STDOUT、 STDERR を open して行う

なんとまぁ、お恥ずかしい。chdirしたところにファイル出力しちゃってました。気を取り直して3問目。
ex14-3.pl

  • dateコマンドの出力を解析して、今日が何曜日か調べるプログラムを書く
  • ウィークデーなら get to work、そうでなければ go play と表示する
  • Unix以外のシステムを使っていて、dateコマンドが用意されていない場合には、以下のプログラムを使う
#!/usr/bin/perl
print localtime() . "\n";

私は上記のプログラムを date.pl として保存して活用しました。

#! perl
use strict;
use warnings;

if ( `date.pl` =~ /^(Sat|Sun)/) {
    print "go play\n";
} else {
    print "get to work\n";
}

出力結果は省略。解答例を見て気づいたことは以下の通り。

  • 頭文字が S かどうかだけでウィークデーでない曜日は特定できる (そのやり方がベターだとは限らない)

なるほどなるほどです。バッククォートでの出力取り込みを上手いこと使えば色々なUnixコマンドや既存のツールと連携した簡易ツールをお手軽に作れそうですね。そもそもPerl勉強し始めた動機がAIX環境でシェルより便利に簡易ツールを作るためだったことを思い出しました。ただ、どんなツールを作りたかったのかは思い出せない罠…。ま、その程度の動機だったので、このぐらいのペースでしか勉強が捗らないわけです。と開き直ることなく、コツコツと勉強してみます。