加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl使用子调用作为另一个子意外上下文的参数

发布时间:2020-12-15 21:46:30 所属栏目:大数据 来源:网络整理
导读:我使用子调用作为另一个子的参数.示例代码: test(isInString(),'second parameter','third parameter');sub test { my ($boolean,$second,$third) = @_; print "boolean: $booleann second: $secondn third: $thirdn";}sub isInString { my $searchFor =
我使用子调用作为另一个子的参数.示例代码:
test(isInString(),'second parameter','third parameter');

sub test {
    my ($boolean,$second,$third) = @_;
    print "boolean: $booleann second: $secondn third: $thirdn";
}

sub isInString {
    my $searchFor = 'a'; 
    my $searchIn = 'bcd';   

    return ($searchFor && $searchIn && ($searchIn =~ $searchFor));
}

在上面的例子中,我希望“isInString”中的return语句计算为false(”或undef或者perl中可能存在的任何东西),这将作为参数#1传递给“Test”,如你所知d基本上有

Test(undef,'third parameter');

但事实并非如此. isInString返回一个空数组,基本上你得到的是

Test('second parameter','third parameter');

从perl调试器中的isInString返回给出:

列表上下文从main :: isInString返回:
空数组

我假设这是一个perl上下文的东西,我可以先分配一个标量变量,它工作正常:

my $bool = isInString();
Test($bool,'third parameter');

调试器给出 –
标量上下文从main :: isInString返回:”

编辑我删除所有parens相同的结果:

sub isInString {
        my $searchFor = 'a'; 
        my $searchIn = 'bcd';   

        return $searchFor && $searchIn && $searchIn =~ $searchFor;
    }

调试器仍然给出:

列表上下文从main :: isInString返回:
空数组

有人可以解释为什么它在这种情况下返回列表上下文/空数组?

解决方法

如果你想强制一个“布尔上下文”你可以使用双负“运算符”:!!,如下所示:
test( !!isInString(),'third parameter' );

通过在参数列表中调用它,您已将其强制转换为“列表上下文”.你可以用这样的东西强制它.一个爆炸(!)在布尔上下文中对其进行求值,并使其为1或”.但既然你没有测试补充,而是价值本身,把另一个爆炸放在那里可以让你回到你想要的价值.

但是,由于从函数体中可以清楚地看到,您正在返回一个布尔值,并且您在列表上下文中调用它(参数列表是列表上下文),您可能希望在那里强制定义一个值.像这样:

return ($searchFor && $searchIn && $searchIn =~ $searchFor) || 0;

任何undef都会导致false值,它会跳转到or并返回0,列表上下文不会忽略它,因为它可以是undef.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读