Perl使用子调用作为另一个子意外上下文的参数
我使用子调用作为另一个子的参数.示例代码:
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'); 调试器给出 – 编辑我删除所有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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |