コマンドライン引数をPerlプログラムに渡すにはどうすればよいですか?


137

私はPerlスクリプトに取り組んでいます。コマンドラインパラメーターをそれに渡すにはどうすればよいですか?

例:

script.pl "string1" "string2"

3
さて、まず第一に、あなたはそれが必要である./script.plか、それとも実行時に完全に何も起こらないでしょう。
パルティアンショット

回答:


189

あなたが何をしたいかに依存します。2つの引数を入力ファイルとして使用する場合は、それらを渡してから、を使用<>してその内容を読み取ることができます。

意味が異なる場合は、GetOpt::StdおよびGetOpt::Longを使用して簡単に処理できます。GetOpt::Stdは1文字のスイッチのみをサポートし、GetOpt::Longはるかに柔軟です。からGetOpt::Long

use Getopt::Long;
my $data   = "file.dat";
my $length = 24;
my $verbose;
$result = GetOptions ("length=i" => \$length,    # numeric
                    "file=s"   => \$data,      # string
                    "verbose"  => \$verbose);  # flag

または、@ARGVすべてのコマンドライン引数を含む特別な変数です。$ARGV[0]は最初(つまり"string1"、あなたの場合)で$ARGV[1]、2番目の引数です。にアクセスするための特別なモジュールは必要ありません@ARGV


29
$ ARGV [0]は最初の引数です。perlは0から数え、プログラム名は@ARGVではなく$ 0にあります。
derobert 2008

4
$ ARGV [0]の混乱にもかかわらず、これは私がSOを検索するときに見つけたいと思っている種類の答えです。ありがとう、+ 1してください。
lexu 2008


60

考えているようにそれらを渡し、スクリプトでは配列から取得します@ARGV。そのようです:

my $numArgs = $#ARGV + 1;
print "thanks, you gave me $numArgs command-line arguments.\n";

foreach my $argnum (0 .. $#ARGV) {

   print "$ARGV[$argnum]\n";

}

ここから。


8
また、一部のプログラミング言語では、最初の(0)引数がコマンドまたはスクリプト自体であることに注意してください。もちろん、perlではそうではありません。
danieltalsky 2008

10
$#ARGV + 1あなたの代わりに@ARGV
Leon Timmermans

1
使用するARGV[0]$argv[1]、特定の引数を探している場合。
Manoj

29
foreach my $arg (@ARGV) {
    print $arg, "\n";
}

各引数を出力します。


getoptsを使用しない場合、これは、引数リストを非破壊的に走査することをお勧めする方法です。基づいてperlmeme.org/howtos/syntax/foreach.html構文が正しいように見えます。警告のために、セクションを確認して制御変数は、リスト要素へのエイリアスです:副作用
jaredor

24

代わりに、よりセクシーな洗練された方法.....

my ($src, $dest) = @ARGV;

「仮定」2つの値が渡されます。追加のコードは、仮定が安全であることを確認できます。


6
これが新しい情報であるかどうかはわかりませんが、あなたが新しいので、私は反対票を投じることに決めました。
Joel Berger

それはセクシーではありません。すべての引数は@ARGV、C / C ++がargv / argcを介してそれらを提供するの同じように、
ユーザーの

21

さらに別のオプションは、perl -sを使用することです。例:

#!/usr/bin/perl -s

print "value of -x: $x\n";
print "value of -name: $name\n";

次に、次のように呼び出します。

% ./myprog -x -name=Jeff
value of -x: 1
value of -name: Jeff

または、詳細については元の記事を参照してください。


13

変数@ARGVのリストに特殊変数を割り当てることにより、それらに直接アクセスできます。したがって、たとえば:

( $st, $prod, $ar, $file, $chart, $e, $max, $flag ,$id) = @ARGV;

perl tmp.pl 1 2 3 4 5

ここに画像の説明を入力してください


7

引数が読み取られるファイル名である場合は、ダイヤモンド(<>)演算子を使用してその内容を取得します。

while (my $line = <>) {
  process_line($line);
}

引数がオプション/スイッチの場合は、すでにslavy13.myopenid.comで示されているように、GetOpt :: StdまたはGetOpt :: Longを使用します。

それらが別のものである可能性が高い場合は、@ ARGVを明示的にウォークスルーするか、shift次のコマンドを使用してアクセスできます。

while (my $arg = shift) {
  print "Found argument $arg\n";
}

shiftすべてsubのの外にいる場合にのみ機能します。内ではsubsubプログラムに渡された引数ではなく、に渡された引数のリストを取得します。)



2

一部の値だけが必要な場合は、@ ARGV配列を使用できます。ただし、コマンドラインオプションの処理を行うために、より強力なものを探している場合は、Getopt :: Longを使用する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.