2013-03-22 3 views
0

У меня есть следующий фрагмент кодаPerl Getopt :: Long Присвоение переменной затем будет подпрограмму

my $use = "Use: " . basename($0) . " [options]"; 
my $version = "Version: 0.1 \n"; 
my $variableA; 
my $variableB; 

GetOptions(
'a=s'   => \$variableA, 
'help'   => sub { print $use; exit 0 }, 
'version'  => sub { print $version; exit 0 }, 
'b'    => sub { \$variableB, &this_subroutine; goto NOWGOHERE; }, 
); 

die "Incorrect use. \n" unless (defined $variableA || defined $variableB); 

sub this_subroutine { 

    print "$variableB\n"; 

} 

NOWGOHERE: print "HELLO I'M NOW HERE\n"; 

То, что я пытаюсь сделать, это установить $variableB, а затем сделать &this_subroutine и goto NOWGOHERE, но я могу только получить это сделать один или другой, но не оба одновременно, используя либо 'b=s' => \$variableB, или sub { &this_subroutine; goto NOWGOHERE;0 },

При попытке сделать как я не могу напечатать $variableB, есть что-то очевидно, я пропускаю или делаю неправильно синтаксически?

Использование 'b=s' => \$variableB, sub { &this_subroutine; goto NOWGOHERE; }, похоже не работает?

ваша помощь очень ценится, большое спасибо

ответ

5

$variableB никогда не будет иметь значения, потому что вы никогда не приписывать ему.

'a=s'   => \$variableA, 

дает $variableA значение, потому что, когда Getopt :: Long получает скалярный реф, он присваивает значение опциона на этот скаляр.

С другой стороны,

'b'    => sub { \$variableB, &this_subroutine; goto NOWGOHERE; }, 

дает Getopt :: Длинной код ссылки, которую он не может присвоить значение параметра в.

На основе документации, кажется, что он передает имя параметра и значение параметра в coderef в качестве параметров, в этом случае

'b=s'    => sub { $variableB = $_[1]; this_subroutine(); goto NOWGOHERE; }, 

, вероятно, следует делать то, что вы хотите.

+0

@DaveSherohman - При использовании ''b' => sub {$ variableB = $ _ [0]; this_subroutine(); goto NOWGOHERE; }, '$ variableB равно' b', который, как вы сказали, передает имя опции. Однако при использовании ''b' => sub {$ variableB = $ _ [1]; this_subroutine(); goto NOWGOHERE; }, '$ variableB равно' 1', а не аргумент, который я предоставил в командной строке? –

+0

Понял причину, потому что '= s' все еще требовалось, см. Редактирование, большое спасибо за вашу помощь. –

Смежные вопросы