[時間割:Perl]『ミニマルPerl』その23
2009/03/30 23:15 posted by kunkichi
最後の更新はもう2週間前、、、やばいやばすぎる、、
ということで久々になってしまいましたが、また時間割再開です。月曜日は「Perl」。えっと、前回に引き続き、スクリプトでよく使う関数のところです。
ミニマルPerl Unix/LinuxユーザのためのPerl習得法
posted with amazlet at 08.10.06
Tim Maher
オライリージャパン
売り上げランキング: 96883
オライリージャパン
売り上げランキング: 96883
- shift
- コマンドライン引数の処理に使う。
- 複数の引数に対して順次shiftしていくと、引数が順に処理されて破棄される。わかりにくいのでスクリプトで。
#!/usr/bin/perl -w引数をいくつかつけて実行してみる。
while(@ARGV){
my $arg = shift @ARGV;
print $arg . "\n";
}
./shift.pl aaa bbb ccc@ARGVをshiftして$argに代入していくと、徐々に@ARGVの要素が減っていくというわけ。
aaa
bbb
ccc - $#ARGVを使うとこんな感じ。
#!/usr/bin/perl -w
while( $#ARGV ge 0 ){
print $ARGV[0] . "\n";
shift;
} - シェルだと$*とか$@とか$#あたりを使っておんなじことができる。
- Perlの場合は最初の例にあるようにshiftで破棄された値を返して変数に入れたりできる。
- シェルで”shift 2″のようにずらす個数を指定できるのはPerlだとできない。ずらす分だけshiftを呼び出す必要がある。
- 最初の例にあるように引数に配列を指定してshiftできるし、複数のスカラーに対してもshiftできる。ちなみに指定しない場合は、スクリプトだと@ARGVでサブルーチンだと@_がデフォルトになる。引数処理に便利なようにできてるね。
では、ここまでやってきた、defined、shift、exitを使ってスクリプトをいろいろ便利にするテクニックを見ていきます。
引数の処理
- 引数の前処理
- コマンドラインスイッチをわざわざ-sオプションで指定していたのを、そのまま使えるようにする。本で紹介されているPerl版grepを書き換えていく。元々はこんな感じ。
#!/usr/bin/perl -wnl -s実行する場合はこんな感じで変数名を指定していた。
BEGIN {
$pattern or
warn "Usage: $0 -pattern='RE' filename\n" and
exit 255;
}
/$pattern/ and print;$ ./grep.pl -pattern='root' /etc/passwd-sの場合は明確に変数名を指定しないといけないので、例えばgrepみたいに、”grep マッチするパターン ファイル名“みたいな指定は無理。shiftを使ってみる。#!/usr/bin/perl -wnlshiftで第1引数はそのままパターンとして読み込んでshift。それ以降はファイル名として処理する。この場合はgrep風に実行OK。
BEGIN {
$pattern=shift;
defined $pattern and $pattern ne "" or
warn "Usage: $0 'RE' filename\n" and
exit 11;
}
/$pattern/ and print; - あと上記のスクリプトでは、以下も入れている。
- $patternが「定義されているか?」を明確にチェックするためにdefinedを使用。
- exitの返り値を独自に設定。
- コマンドラインスイッチをわざわざ-sオプションで指定していたのを、そのまま使えるようにする。本で紹介されているPerl版grepを書き換えていく。元々はこんな感じ。
と、途中だけど今日はここまで。引数処理のテクニックはまだ続きます。







コメント&トラックバック
トラックバックURL: