我想在Perl中调用子例程,如:
sub temp {
---- some code -----
}
temp(-switchName, value1, --switchName2, value2)
就像我知道Getopt :: Long是命令行开关类型参数。 所以我想知道子程序类型的参数。
答案 0 :(得分:3)
为什么人们可能想要这样做有很多原因,但你没有这么说,我将不得不推测一些。
在命令行上切换很有用,因为命令行程序会将选项与参数列表混淆,需要某种方式来了解差异。因此,“以 - 开头的事物 - 不是常规参数”惯例。
command --key value --key2 value2 file1 file2 file3
command file1 --key value file2 --key2 value2 file3
你当然可以用子程序做类似的事情,在那里它选择查找以--
开头的事物的参数列表,并暗示列表中的下一个是关联的值...但子程序有更好的更简单的方法。
temp( ["file1", "file2", "file3"], { something => 1 } );
在这种情况下,主要的参数列表首先作为数组引用传递,并且选项在散列引用中传递第二个。没有歧义。
sub temp {
my($files, $options) = @_;
print "Something!\n" if $options->{something};
for my $file (@$files) {
...do something with $file...
}
}
您甚至可以更进一步,并将所有内容作为选项传递。
temp( files => ["file1", "file2", "file3"], something => 1 );
sub temp {
my %args = @_;
print "Something!\n" if $args{something};
for my $file (@{$args{files}}) {
...do something with $file...
}
}
如果不清楚什么是选项以及什么是参数,这是有用的。这里的“带选项的文件列表”可能有点过分。
答案 1 :(得分:2)
如果我理解正确,您可以将参数传递给哈希并使用它来访问它们。像那样:
sub temp {
my %opts = @_;
if ($opts{'-switch1'}) {
# ... do something ...
}
...
}
temp(-switch1 => 1);
# or
temp(-switch1, 1);