我正在尝试使用来自GetOpt :: Long的GetOptions函数调用一个接受参数的子例程。但是,无论是否在命令行上指定选项,子例程都会被调用。如果在GetOptions行中未传递参数给子例程,则不会发生此意外行为。
下面是问题的最小演示:
如果在GetOptions行中向子例程提供参数,则无论是否在命令行上提供其控制选项,子例程最终都将被调用:
相反,如果在没有参数的情况下在
下面是问题的最小演示:
如果在GetOptions行中向子例程提供参数,则无论是否在命令行上提供其控制选项,子例程最终都将被调用:
$ cat a1.pl
#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long qw(GetOptions);
my $var="entered";
GetOptions ( "opt" => \&sub1($var) );
sub sub1 { print "sub1 $_[0]\n"; }
$ perl a1.pl --opt
sub1 entered
$ perl a1.pl
sub1 entered
相反,如果在没有参数的情况下在
GetOptions
中调用子程序,则其行为是适当的:$ cat a2.pl
#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long qw(GetOptions);
GetOptions ( "opt" => \&sub2 );
sub sub2 { print "sub2 entered\n"; }
$ perl a2.pl --opt
sub2 entered
$ perl a2.pl
我做错了什么?
PS:我知道我可以简单地设置一个变量来控制是否在 GetOptions
块之后调用子例程,但我想确定在 GetOptions
行内调用子例程的正确语法,并理解为什么会发生观察到的行为。