「初めてのPerl」 14章 (プロセス管理)
APOGEEの『Fantastic』を爆音で聴きながらPerlの勉強をしているbonlifeです。いやぁ、このアルバムは凄い。という話はまた後日。「初めてのPerl」の14章は「プロセス管理」。14章の内容はだいたい以下のような感じです。
- system関数 (子プロセスを起動)
- exec関数 (Perlプロセス自身がジャンプする感じ)
- 逆クォートを使った出力の取り込み
- パイプオープン (プロセスをファイルハンドルとして使う)
- fork (詳細は別の本で学んで状態)
- シグナルの送受信
なんだか結構難しいじゃないの。結構OS寄りの低レベルな内容ですね。forkは何度か見たことがある気がするので、次に見かけた時にちゃんと勉強することにして、今回はスルー。そんなこんなで早速練習問題のbonlife的(not 模範)解答例です。
ex14-1.pl
- あるディレクトリに移動してから、ls -l コマンドを実行して、そのディレクトリに対する詳細形式のディレクトリリストを表示するプログラムを書く
- 「あるディレクトリ」はハードコードする
- Unix以外のシステムを使っている場合、そのシステムのコマンドを使う
#! 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環境でシェルより便利に簡易ツールを作るためだったことを思い出しました。ただ、どんなツールを作りたかったのかは思い出せない罠…。ま、その程度の動機だったので、このぐらいのペースでしか勉強が捗らないわけです。と開き直ることなく、コツコツと勉強してみます。