gpt4 book ai didi

perl - 为什么我在 perl 的标量上下文中获取列表中的最后一个值?

转载 作者:行者123 更新时间:2023-12-02 07:01:40 25 4
gpt4 key购买 nike

我曾假设,在 perl 中,$x=(2,3,4,5)($x)=(2,3,4,5) 会给我相同的结果,但对我的测试中发生的事情感到惊讶。我想知道为什么这种行为是这样的,为什么 wantarray 的行为不同。这是我的测试和结果:

>perl -e '$x=(1,2,3,5);print("$x\n")'
5
>perl -e '($x)=(1,2,3,5);print("$x\n")'
1
>perl -e '$x=(wantarray ? (1,2,3,5) : 4);print("$x\n")'
4
>perl -e '($x)=(wantarray ? (1,2,3,5) : 4);print("$x\n")'
4

这种行为在所有平台上是否一致/可靠?

糟糕。 wantarray 用于子程序调用的上下文...

>perl -e '$x=test();sub test{return(1,2,3,5)};print("$x\n")'
5
>perl -e '($x)=test();sub test{return(1,2,3,5)};print("$x\n")'
1
>perl -e '$x=test();sub test{return(wantarray ? (1,2,3,5) : 4)};print("$x\n")'
4
>perl -e '($x)=test();sub test{return(wantarray ? (1,2,3,5) : 4)};print("$x\n")'
1

所以我猜它是一致的,但为什么列表返回标量上下文中的最后一个值?

最佳答案

So I guess it is consistent, but why does the list return the last value in scalar context?

因为它很有用。

my $x = f() || ( warn('!!!'), 'default' );

好吧,至少比任何其他选择都更有用。它也与其更强大的表亲 ; 一致。

sub f { x(), y(), z() };

相同
sub f { x(); y(); z() };

每个运算符决定它在标量和列表上下文中返回的内容。[1]

有些运算符甚至只返回一个标量。

say time;             # Returns the number of seconds since epoch
say scalar( time ); # Ditto.

但是通常返回多个标量的运算符和返回可变数量标量的运算符不可能在标量上下文中返回该标量,因此它们将返回其他内容。由每个人决定那是什么。

 say scalar( 4,5,6 );           # Last item evaluated in scalar context.
say scalar( @a ); # Number of elements in @a.
say scalar( grep f(), g() ); # Number of matching items.
say scalar( localtime ); # Formatted timestamp.

列表运算符(例如 x,y,z)返回列表的最后一项 (z) 在标量上下文中计算时返回的内容。例如,

 my $x = (f(),g(),@a);

是一种奇怪的写作方式

 f();
g();
my $x = @a;

注释

  1. 对于 subs 也是如此,尽管编写在标量上下文中调用无用的 subs 是很常见的。

关于perl - 为什么我在 perl 的标量上下文中获取列表中的最后一个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19689393/

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