【问题标题】:Use of defined/undef in Perl在 Perl 中使用 defined/undef
【发布时间】:2021-11-15 18:17:27
【问题描述】:

我打算将两个变量传递给一个 perl 函数,其中一个可能是可选的。我正在尝试检查第二个是否已定义,但它无法正常工作。当我将该函数称为 myFunction(18) 时,它假定变量 $optional 已定义并转到 else 语句。但是在 else 语句中,当访问 $optional 变量时,它会引发“未初始化”错误。这与我的预期完全相反。非常感谢任何帮助。

sub myFunction {
    my ($length, $optional) = (@_);

    if (undef($optional) {
        more code..
    }
    else {
        more code...
    }
}

myFunction(18);

【问题讨论】:

  • 那是因为未定义值的测试是not defined,而不是undef
  • 如果你想知道有多少通过了,然后计算参数的数量:scalar(@_)。如果你调用foo(4,undef),你已经传递了 2 个参数。

标签: perl


【解决方案1】:

正确的函数是definedundef 取消定义 $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+)是使用“定义或”运算符//,如下所示:

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';

无论哪种方式,我通常更喜欢使用合理的默认设置,而不是完全独立的控制流路径。这通常是简化代码的好方法。

【讨论】:

  • $SCALAR = undef; 只是取消定义。 undef(VAR) 做的更多,即使对于标量也是如此。 (它释放各种内存位。)
  • @ikegami 没错,但为什么要把事情复杂化呢?我坚持perldoc -f undef 中记录的行为。也许“公正”这个词是问题所在。我会删除它。
  • shift 将一个元素从数组的左侧(低索引侧)移出并返回该值。所以my $foo = shift @bar@bar 的大小减少了一个元素,但将最左边的元素分配给$foo。如果没有提供源数组,则在子例程中shift 作用于@_,这是传入参数的地方。在子例程之外,如果没有明确提供源数组,它将作用于@ARGV
【解决方案2】:
my $optional = defined( $_[0] ) ? shift : 'Default value';

这是一个危险的代码,因为它只会在定义时关闭参数,如果你有第三个参数,当你调用时会变得混乱

MyFunc( 10, undef, 20 )

【讨论】:

    猜你喜欢
    • 2017-01-28
    • 2019-11-13
    • 2021-02-18
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 2019-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多