我如何检查子例程 returns *nothing*

How can I check if a subroutine returns *nothing*

如何确定 perl 函数 return nothing 甚至 undef

示例:

sub test {
   return;
}

sub test {}

问题是好奇的代理函数也可以 return 字符串,列表,...并且是外国包的一部分。所以我无法检查 test() || undef 因为空列表或字符串将被 undef.

覆盖

有谁知道如何检查 "null" 值,以便创建条件异常?

If you use return and you specify no return value, the subroutine returns an empty list in list context, the undefined value in scalar context, or nothing in void context.

If no return is found and if the last statement is an expression, its value is returned. If the last statement is a loop control structure like a foreach or a while, the returned value is unspecified. The empty sub returns the empty list.

-perlsub

在这两种情况下,它都会 return 空列表。所以你无法区分它们。

如果我对您的理解正确,那么您是在尝试避免空列表被 undef 覆盖 test () || undef。但这没关系。在 Perl 中,空列表和 undef 都被认为是错误的。

以下所有计算结果为 false

0
'0'
undef
''  # Empty scalar
()  # Empty list
('')

没办法"return nothing not even undef"*

如果您将其称为

,则您描述的子例程 test 的计算结果为 undef
my $ret = test();

或者一个空列表,如果你将它命名为

my @ret = test();

您对此的处理取决于您的子例程可能 return 的 有效 值。它是针对 return 列表还是标量设计的?

显然,错误条件必须与任何有效的 return 值不同,常见的方法是始终 return 一个标量值,如果您需要 [=36],它可能是一个参考=] 多个值

假设您有一个垃圾子例程return是给定范围内所有值的列表

use strict;
use warnings;
BEGIN { require v5.10 }
use feature 'say';

STDOUT->autoflush;

sub range {
    my ($start, $end) = @_;

    return if $end < $start;

    return [ $start .. $end ];
}

my $range = range(1, 3) or die;
say for @$range;

$range = range(10, 1) or die;
say for @$range;

输出

1
2
3
Died at E:\Perl\source\twice.pl line 19.

如果参数错误,returned 的值为 undef,调用代码可以随意使用该信息