2012-04-02 6 views
-1

コード:奇妙なgetopt = sの取り扱いですか?

#!/usr/bin/env perl 
use strict; 
use warnings; 
use locale; 

my $prepinac_r = ''; 
my $array_name = ''; 

use Getopt::Long; 
Getopt::Long::Configure ("bundling"); 
my $result = GetOptions(
"r=s" => \$prepinac_r, 
"array-name=s" => \$array_name); 

print STDERR "r: $prepinac_r\n"; 
print STDERR "array_name: $array_name\n"; 

がそれを実行している:

script.pl --array-name=kokos -r=kure 

出力:

r: =kure 
array_name: kokos 

私が間違っているのは何を?私は何を取りこぼしたか?どうして-rが "kure"ではなく "kure"になるのですか?助けてください...

+0

Getopt :: Long :: Configure( "bundling_override"); – rluks

答えて

4

短い形式と長い形式の構文が混在しています。短い形式の構文では=が使用されないため、短くなりません。

"a|all"  => \$opt_all, 
"e|execute=s" => \$opt_execute, 

短い形式:

-aefoo 
-a -efoo 
-a -e foo 

ロング形式:

--all --execute=foo 
--all --execute foo 

は、ここであなたが精通かもしれない短い形式の例です:

perl -le'print "Hello World";' 
perl -l -e'print "Hello World";' 
perl -l -e 'print "Hello World";' 
+0

'-e = x = x'が' = x = x'を意味するのか、短い形式が '='が許されているのか 'x = x'を知る方法はありません。 – ikegami

1

氏学生、あなたはダブルを使用する必要があります-

script.pl --array-name=coconut --r=chicken 

...

r: chicken 
array_name: coconut 
+0

それは彼が特に可能にするバンドルを妨げるでしょう。 – ikegami

+0

はい、私はそれもやっていますが、私はプログラムの引数に厳しい制限がありました – rluks

0

>>両方のスイッチのために私はあなたが見ている現象は、 "バンドル" であると信じています。あなたは、「バンドル」を使用している場合はGetopt::Long

Enabling this option will allow single-character options to be bundled. To distinguish bundles from long option names, long options must be introduced with -- and bundles with - 

から

ので -

--array-name=foo --r=bar # Works 
-afoo -rbar    # Also works 

--array-name=foo -r=bar # Does not. as you've already seen 

をあなたは必要としないオプションを使用していない限り、それはまた、バンドルを使用しても意味がありません。パラメータ、そのために "バンドル"することができます