如何检查子程序是否返回*没有*

时间:2016-10-05 11:15:25

标签: perl subroutine

如何确定perl函数返回nothing甚至不undef

示例:

sub test {
   return;
}

sub test {}

问题是,好奇的行为函数也可以返回字符串,列表......并且是外包的一部分。因此,我无法与test() || undef核对,因为空列表或字符串将会被undef覆盖。

有没有人知道如何检查" null"值,所以我可以创建一个条件异常?

2 个答案:

答案 0 :(得分:5)

  

如果使用return并且未指定返回值,则子例程返回空列表   在列表上下文中,标量上下文中的未定义值,或者没有任何内容   无效背景。

     

如果没有找到return并且最后一个语句是表达式,则为   返回值。如果最后一个语句是循环控制结构   与foreachwhile类似,返回的值未指定。的的   empty sub返回空列表

- perlsub

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

如果我理解正确的话,你试图避免使用undef覆盖空列表test () || undef。但这并不重要。在Perl中,空列表和undef都被视为false。

以下全部评估为假

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

答案 1 :(得分:-2)

没有办法"甚至不返回任何东西" *

如果您将其称为<{p>},则您描述的子例程test的评估结果为undef

my $ret = test();

或如果您将其称为

,则为空列表
my @ret = test();

您采取的措施取决于您的子程序可能返回的有效值。它是否设计为返回列表或标量?

显然,错误条件必须与任何有效的返回值不同,常见的方法是始终返回标量值,如果需要返回多个值,则可以作为引用

假设您有一个trash子例程,它返回给定范围内所有值的列表

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.

如果参数不正确,则返回值为undef,并且调用代码可以根据需要使用该信息