[ トップ | 一覧 | 更新履歴 ]

PerlCommandLine

PerlProgramming

perlプログラムのコンソールでの実行

perlのコマンドラインパラメータの渡し方

ファイルアクセスするプログラム、特に標準入力からデータを受け取る<>を記述すると

 % perl script.pl para1 para2

指定されたpara1,para2(すべての引数)は、ファイル名と解釈され、そのファイルから の入力となります。

問題点

<>から入力するperlプログラムにパラメータを渡したいときに、そのパラメータを 受け取る際、先に@ARGVを操作する必要があります。パラメータとして受け取りたい 値を先に受け取って@ARGVから除外(削除)しないと、そのパラメータがファイル名と解釈 され、ファイルオープンしようとしてしまいます。

sample head.pl

 % ./head.pl 10 < file

テキストファイルの先頭n行を表示するようなコマンドを作ってみます。 最初のパラメータで行数(上の例では10行)を指定します。

 #!/usr/local/perl
 &main_handle;
 exit;
 sub main_handle
 {
    my  $num = $ARGV[0];
    my  $str;
    for(my $lin=0; $lin < $num; $lin++){
        last unless($str=<>);
        print $str;
    }
 }

実行してみます。

 $ perl head.pl 5 < head.pl
 Can't open 5: そのようなファイルやディレクトリはありません

<>があるために、@ARGVのすべての要素をファイル名とみなし、入力として読み込もうと するため、このエラーが表示されます。

sample 2

改善するには、<>が実行される前に@ARGVの中のパラメータを横取りしておく必要があります。

BEGIN{}の中で横取りし、shiftで@ARGVから抜き取ってしまう方法をとるとすると次のようになります。

 #!/usr/local/perl
 my  $num;
 BEGIN{
    $num = shift @ARGV;
 }
 &main_handle;
 exit;
 sub main_handle
 {
    my  $str;
    for(my $lin=0; $lin < $num; $lin++){
        last unless($str=<>);
        print $str;
    }
 }

 $ perl head.pl 5 < head.pl
 #!/usr/local/perl
 my   $num;
 BEGIN{
     $num = shift @ARGV;
 }
 $

次のようにリダイレクトでなくても同じ結果になります。

 $ perl head.pl 5 head.pl
 #!/usr/local/perl
 my   $num;
 BEGIN{
     $num = shift @ARGV;
 }
 $

これは、起動時は@ARGVには、

 $ARGV[0]  5
 $ARGV[1]  "head.pl"

が設定されていますが、BEGIN内で、shiftしているため、

 $ARGV[0] "head.pl"

となり、最初の<>のときに@ARGVに設定されたファイル名があればそれをオープンするため 同じ結果になります。

オプションをハイフン[-]で複数指定するような場合も、これを応用すればできますね。


GzuGzu (WikiWikiWeb descendant) ver 1.00 pre2
このページはGzuGzuで作成されました.
yaino.com