初めてのPerlを読み返す 14−15章 プロセス・文字列処理

初めてのPerl
初めてのPerl
posted with amazlet at 09.04.05
ランダル・L. シュワルツ トム フェニックス
オライリージャパン
売り上げランキング: 34126


この記事のスタンスはこちら


14章 プロセス管理*1

  • system関数で子プロセスを起動。
# これと…
system $command;
# これは同じ。
system "/bin/sh", "-c", $command;

# 引数が2個以上存在する場合、明示的に指定しない限りシェルは起動されない
system "tar", "cvf", $tarfile, @dirs;
  • exec関数でプロセスを起動。Perlプロセスではなく、実行コマンドのプロセスになる。
  • 逆クォートで挟むことにより、標準出力を取り込むことが出来る。
chomp(my $now = `date`);
print "The time is $now";
open DATE, "date|" or die "Cannot pipe from date: $!";
my $now = <DATE>;
close DATE;
  • forkの例
defined(my $pid = fork) or die "Cannot fork; $!";
unless ($pid){
  # 子プロセスはここに来る
  exec "date";
  die "Cannot exec date: $!";
}
# 親プロセスはここに来る
# 子プロセスの終了を待つ
waitpid($pid, 0);
  • シグナルの送受信にはkillを使ったり、特殊ハッシュ%SIGを使ったりする。

15章 文字列処理とソート

  • 文字列関数色々
# 「index」 文字列を探し、インデックスを返却する
my $stuff = "Howdy world!";
my $where1 = index($stuff, "w"); # $where1=2
my $where2 = index($stuff, "w", $where1+1); # $where2=6

# 「rindex」 後ろから文字列を探し、インデックスを返却する
my $fred = "yabba dabba doo!";
my $where1 = rindex($fred, "abba"); # $where=7
my $where2 = rindex($fred, "abba", $where1-1); # $where=1

# 「substr」部分文字列の取得
my $mineral = substr("Fred J. Flintstone", 8, 5); # $mineral="Flint"

# 「sprintf」 フォーマットを指定して出力
#   以下は金額フォーマットを返却する関数
#     入力:12345678.9 => 出力:$12,345,678.90
sub big_money{
 my $num = sprintf "$.2f", shift @_;
 1 while $num =~ s/^(-?\d+)(\d\d\d)/$1,$2/;
 $num =~ s/^(-?)/$1\$/;
 $num;
}
  • 高度なソート
# リストソート
sub by_number { $a <=> $b } # 数値ソート
sub ASCIIbetically { $a cmp $b } # 文字列ソート
sub case_insensitive { "\L$a" cmp "\L$b" } # 文字列ソート(大文字と小文字の区別なし)

my @result = sort by_number @some_numbers; # 1. 数値ソートの使用
my @result = sort { $a <=> $b } @some_numbers; # 2. 1と同じ
my @result = reverse sort { $a <=> $b } @some_numbers; # 3. 逆順ソート
my @result = sort { $b <=> $a } @some_numbers; # 4. 3と同じ


# ハッシュソート
sub by_hash { $hash{$a} <=> $hash{$b} } # ハッシュソート(値)

my @array = sort by_hash keys %hash; # ハッシュソートの使用

# 複数ソートの使用
sub by_hash_and_key {
  $hash{$a} <=> $hash{$b}
    or
  $a cmp $b
}


プロセス管理についてはもうちょっと詳しく勉強したいなぁ。
また文字列処理は必須知識でしょう。

*1:以下引用をいくつか含みます