我打算将两个变量传递给perl函数,其中一个可能是可选的。我试图检查第二个是否已定义,但它无法正常工作。当我将函数调用为myFunction(18)时,它假定变量$ optional已定义并转到else语句。但是在else语句中,当访问$ optional变量时,它会抛出“未初始化”错误。这与我的预期完全相反。非常感谢任何帮助。
sub myFunction {
my ($length, $optional) = (@_);
if(undef($optional)
{
more code..
}
else
{
more code...
}
}
myFunction(18)
答案 0 :(得分:22)
正确的功能是defined
。 undef
取消定义$optional
。你想做的是这样的:
sub myFunction {
my( $length, $optional ) = @_;
if( ! defined $optional ) {
# Do whatever needs to be done if $optional isn't defined.
}
else {
# Do whatever can be done if $optional *is* defined.
}
}
另一种处理它的方法(尤其是Perl 5.10+)是使用“defined or”运算符//
,如下所示:
sub MyFunc {
my $length = shift;
my $optional = shift // 'Default Value';
# Do your stuff here.
}
这样做可以检测是否定义了shift @_
的返回值。由于您已经调用了一次shift,我们现在正在测试第二个参数。如果已定义,请将值指定给$optional
。如果未定义,请将'Default Value'
分配给$optional
。当然,你必须提出自己的理智默认值。
如果你陷入了Perl 5.10之前的黑暗时代,你可以用以下方式完成同样的事情:
my $optional = shift;
$optional = defined $optional ? $optional : 'Default value';
...或...
my $length = shift;
my $optional = defined( $_[0] ) ? shift : 'Default value';
无论哪种方式,我通常更喜欢具有理智的默认值,而不是完全独立的控制流路径。这通常是简化代码的好方法。
答案 1 :(得分:0)
my $optional = defined( $_[0] ) ? shift : 'Default value';
这是危险的代码,因为它只会在定义的情况下移动参数,如果你有第三个参数,当你打电话时会混淆
MyFunc( 10, undef, 20 )