Perl日記

PerlとかRubyとかPHPとかPythonとか

Perlでパラメータの受け取り方

続・lsコマンドをPerlで - Perl日記
この時の後回し課題。
Perlで実行時にパラメータを引数として扱うための標準モジュールは2つあり、Getopt::StdとGetopt::Longがある。
Perlクイックリファレンス」を見たら、次のように書かれていた。

$result = GetOptions(option-descriptions)

 option-descriptionsで与えられたオプション記述に基づいて、Perlプログラムの起動時に指定されたコマンドラインオプションの取り出しと処理を行なう。各オプションは@ARGVから取り出される。GetOptionsによるオプションの処理後には、@ARGVにはオプション以外のコマンドライン引数だけが含まれていることになる。

PERLクイックリファレンス (クイックリファレンスシリーズ)

PERLクイックリファレンス (クイックリファレンスシリーズ)

なるほど。
前回調べた時に「-a」とか「--r」とかは普通にGetopt::Std、Getopt::Longを使えば良いというところまでは分かったのだけれど、それ以外の引数の取り方が分からなかった。
つまり、

# ls.pl
use Getopt::Std;
getopt('x', \%opts);
print $opt{x}, "\n";
# --------------------
# $ perl ls.pl -x 128
# 128


はできるけれど、

# ls.pl
use Getopt::Std;
getopt('x', \%opts);
print $opts{x}, "\n";
# --------------------
# $ perl ls.pl -x 128 /var/www/cgi-bin/
# 128


でpathである部分の「/var/www/cgi-bin」の取り方が分からなかったが、
前述の引用より、getopt()が終わった後にまだ@ARGVに残っているわけだ。

# ls.pl
use Getopt::Std;
getopt('x', \%opts);
print $opts{x}, "\n";
print "@ARGV", "\n";
# --------------------
# $ perl ls.pl -x 128 /var/www/cgi-bin/
# 128
# /var/www/cgi-bin/


うん、ばっちり。
これを使えばコマンドラインスイッチが完璧に処理できるな。

次はこれでlsをもっときっちり再現してみよう。