Perl   发布时间:2022-04-07  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Perl使用子调用作为另一个子意外上下文的参数大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用子调用作为另一个子的参数.示例代码:
test(isinstring(),'second parameter','third parameter');

sub test {
    my ($Boolean,$second,$third) = @_;
    print "Boolean: $Boolean\n second: $second\n third: $third\n";
}

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上下文的东西,我可以先分配一个标量变量,它工作正常:

@H_364_2@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.

大佬总结

以上是大佬教程为你收集整理的Perl使用子调用作为另一个子意外上下文的参数全部内容,希望文章能够帮你解决Perl使用子调用作为另一个子意外上下文的参数所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。