我是perl的新手,我已经定义了一个函数
sub ex_arg($_)
{
print "$_[0]\n";
print "$_[1]\n";
print "$_[2]\n";
}
1;
在另一个页面中,我正在调用该页面。
require "ex_arg.pl";
ex_arg(1,2,3);
ex_arg(1,,3); #in the second function i want the second parameter to be null
1;
是否可以这样做。我没有得到第二个参数而是第三个参数作为第二个参数。
我做错了什么。请纠正我。
提前致谢。
答案 0 :(得分:8)
问题是你的参数列表在传递给子例程之前不会为第二个参数保留空值。列表1,,3
将扩展为与1,3
相同的列表。
您需要传递一些实际存在的值,例如undef
或空字符串。
ex_arg(1, undef, 3);
然后可能像
sub ex_arg {
my ($arg1, $arg2, $arg3) = @_;
if (! defined($arg2)) { # checking if arg2 is empty
# do something
}
}
在相关说明中,除非您知道它的作用,否则不应在子例程声明中使用原型。它们用于在子程序中创建特定的行为,它与其他语言的工作方式无关,与子程序中的变量有关。
sub foo ( ... ) {
#^^^^^^^----- prototypes
sub foo { # this is the standard way to declare
答案 1 :(得分:5)
试试这个,
ex_arg(1, undef, 3);
对于perl, ex_arg(1, , 3)
与ex_arg(1, 3)
perl -MO=Deparse -e 'ex_arg(1, , 3);'
ex_arg(1, 3); # <<<<<< deparsed
旁注;如果您不想使用prototypes,那么sub ex_arg {..}
就是您想要的。
首选my ($x,$y) = @_;
优先于$_[0]
和$_[1]
。