gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:28:18 25 4
gpt4 key购买 nike

我使用 sub 调用作为另一个 sub 的参数。示例代码:

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, 'second parameter', 'third parameter');

但这不是发生的事情。 isInString 返回一个空数组,基本上你得到的是
Test('second parameter', 'third parameter');

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

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

我假设这是一个 perl 上下文,我可以先分配给一个标量变量,它工作正常:
my $bool = isInString();
Test($bool, 'second parameter', 'third parameter');

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

编辑我删除了所有具有相同结果的括号:
sub isInString {
my $searchFor = 'a';
my $searchIn = 'bcd';

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

调试器仍然给出:

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

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

最佳答案

您的 return在列表上下文中计算,因为该函数是在列表上下文中调用的。 bool 运算符(如 && )不强制标量上下文。

报价 perlop on && :

Scalar or list context propagates down to the right operand if it is evaluated.



由于匹配运算符在列表上下文中失败时返回一个空列表,这就是您得到的。如果要强制标量上下文,请使用 scalar运算符(operator),无论是在您的 return语句,或当您调用该函数时。

此外,括号强制列表上下文的想法(如其他一些答案所建议的)是一种常见的误解。他们没有。列表上下文是默认值;任何可能是列表上下文的都是列表上下文。这就是为什么没有 list对应于 scalar 的运算符.括号“强制”列表上下文的一个地方是使用重复运算符。 'a' x 3意味着 'aaa' ,但是 ('a') x 3意味着 ('a', 'a', 'a') .但这实际上并不是强制列表上下文,它只是 the x operator 的一个特例.

关于Perl 使用 sub 调用作为另一个 sub - 意外上下文的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3375312/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com