web-dev-qa-db-ja.com

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

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

例:

script.pl "string1" "string2"
132
lamcro

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

意味が異なる場合は、GetOpt::StdGetOpt::Longを使用して簡単に処理できます。 GetOpt::Stdは単一文字のスイッチのみをサポートし、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にアクセスするために特別なモジュールは必要ありません。

186
user44511

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

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

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

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

}

ここ から。

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

各引数を出力します。

29
nrich

または、よりセクシーなパーリッシュな方法.....

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

2つの値が「想定」されます。余分なコードにより、仮定が安全であることを確認できます。

24
rastin71

さらに別のオプションは、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

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

20
Joao Costa

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

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

Perl tmp.pl 1 2 3 4 5

enter image description here

13
pkm

引数が読み取り元のファイル名の場合、ダイアモンド(<>)演算子を使用してその内容を取得します。

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を使用してこれを行うと、すべてのsubsの外にいる場合にのみ機能します。sub内では、プログラムに渡される引数ではなく、subに渡される引数のリストを取得します。)

7
Dave Sherohman
my $output_file;

if((scalar (@ARGV) == 2) && ($ARGV[0] eq "-i"))

{

$output_file= chomp($ARGV[1]) ;


}
5
user3331697

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

2
Marc