gpt4 book ai didi

perl - 为什么函数参数会引发列表上下文?

转载 作者:行者123 更新时间:2023-12-04 17:09:56 26 4
gpt4 key购买 nike

我有一个函数,它取决于调用上下文,我想将此函数用作其他函数的参数。令人惊讶的是,我发现这个 second现在在列表上下文中调用函数。我尝试使用 +() 强制标量上下文但它不像我预期的那样工作。所以唯一的方法是用 scalar 隐式调用它。 .

use 5.010;

say first( 1, second( 'y' ) );
say first( 1, +( second( 'y' ) ) );
say first( 1, scalar second( 'y' ) );

sub first {
my $x = shift;
my $y = shift;

return "$x + $y";
}

sub second {
my $y = shift;

if ( wantarray ) {
qw/ array array /;
} else {
'scalar';
}
}
__END__
1 + array
1 + array
1 + scalar

函数的参数被视为列表,但这是否意味着该列表中的每个参数也暗示列表上下文?如果是,那为什么?

并且,使用 scalar有效,但是我必须在标量上下文中调用这个函数的其他方式(没有中间变量)?

最佳答案

在列表上下文中评估函数参数是有意义的:

  • 在 Perl 中,所有子例程都将列表映射到列表。
  • 如果 sub 接受一个列表,那么在列表上下文中评估所有参数是有意义的,这使得函数可以组合。考虑map :
    map { ... } 1, 2, 3; # makes sense
    map { ... } foo(); # can we "return 1, 2, 3" for the same effect?

    如果 foo()在标量上下文中调用,这将等价于 return 3当我们打算返回列表时 1, 2, 3 .使用列表上下文使我们能够在没有太多显式循环的情况下组合列表转换。 Schwartzian 变换就是一个很好的例子:
    my @sorted =
    map { $_->[1] }
    sort { $a->[0] <=> $b->[0] }
    map { [make_key($_), $_] }
    @input;

  • 有两种方法可以在列表上下文中评估参数:
  • 使用强制标量上下文的表达式,例如 scalar或标量操作。
  • 使用 ($) 之类的原型(prototype).这破坏了函数的可组合性,需要预先声明您的子例程,可能具有令人困惑的语义,并且是远距离操作。因此应避免使用原型(prototype)。

  • 您的 +(...)没有强制标量上下文,因为一元加不强制上下文。它通常用于消除函数应用程序中的括号(例如用于优先级)的歧义,例如 map +($_ => 2*$_), 1, 2, 3 .

    一元加号与二元加号不同,二元加号是一种算术运算符,它在其操作数上施加标量上下文并将它们强制为数字。

    关于perl - 为什么函数参数会引发列表上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21061660/

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