第14章 プロセス管理 練習問題

本日はコードが冗長になりがち。

1. ls -lの結果を出力するプログラム

ディレクトリの指定はハードコードすればよいらしいです。

#!/usr/bin/env perl -w
use strict;

# 指定のディレクトリに移動
my $dir = '/'; # ディレクトリの指定は直接書く(ハードコード)
chdir $dir or die "can't change working directory to $dir: $_";

# ls -lを実行して結果を得る
my $result = `ls -l`;
print $result;

ここでは逆クォートを使ったけど、systemやexecなど方法はいっぱい。

2. 1のプログラムの出力先をファイルにする

標準出力をls.out、標準エラー出力をls.errに出力します。

#!/usr/bin/env perl -w
use strict;

# 標準出力と標準エラー出力をオープンし直す
open STDOUT, "> ls.out" or die "can't open the file: $!";
open STDERR, "> ls.err" or die "can't open the file: $!";

my $dir = '/';
chdir $dir or die "can't change working directory to $dir: $_";

# 今度はexecで実行してみました
exec 'ls -l' or die "can't execute the command: $!";

親プロセスの標準出力と標準エラー出力は子プロセスに引き継がれるので万事おk。

3. dateコマンドの結果を分析して、平日か休日かを調べる

Mac OS Xだとdateの出力が、

$ date
金  5 12 21:47:15 JST 2006

と日本語になります。やりにくいので、プログラムの中で英語で出力するようにしときますよ。

#!/usr/bin/env perl -w
use strict;

#英語で日付を取得して曜日を抽出
`LANG=C date` =~ /^(\S+)\b/;
my $day = $1;

if ($day =~ /Mon|Tue|Wed|Thu|Fri/) { # 平日
    print "get to work\n";
} elsif ($day =~ /Sat|Sun/) { # 休日
    print "go play";
}

正規表現で曜日の部分だけ取り出してマッチさせます。しかし、解答のコードはこれより相当シンプルです。解答をふまえて書き直すと、

#!/usr/bin/env perl -w
use strict;

if (`LANG=C date` =~ /^(Sun|Sat)/) { #休日
    print "go play";
} else { # 休日以外
    print "get to work\n";
}

短いゾー。たいそうな正規表現つかわなくてもちゃんと書けます。わかりやすいのがすてき。

初めてのPerl

初めてのPerl

  • 作者: ランダル・L.シュワルツ,トムフェニックス,Randal L. Schwartz,Tom Phoenix,近藤嘉雪
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2003/05
  • メディア: 単行本
  • 購入: 15人 クリック: 474回
  • この商品を含むブログ (294件) を見る