初めてのPerlを読み返す 14−15章 プロセス・文字列処理
この記事のスタンスはこちら。
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:以下引用をいくつか含みます