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

hep*_*t72 2 perl scalar list

我曾经假设,在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
Run Code Online (Sandbox Code Playgroud)

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

哎呦.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
Run Code Online (Sandbox Code Playgroud)

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

ike*_*ami 5

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

因为它很有用.

my $x = f() || ( warn('!!!'), 'default' );
Run Code Online (Sandbox Code Playgroud)

嗯,至少比任何其他选择更有用.这也与其强大的堂兄一致;.

sub f { x(), y(), z() };
Run Code Online (Sandbox Code Playgroud)

是相同的

sub f { x(); y(); z() };
Run Code Online (Sandbox Code Playgroud)

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

名义上返回单个标量的运算符将在列表和标量上下文中返回相同的内容.

say time;             # Returns the number of seconds since epoch
say scalar( time );   # Ditto.
Run Code Online (Sandbox Code Playgroud)

名义上返回多个或可变数量的标量的运算符无法在标量上下文中返回,因此它将返回其他内容.由它来决定那是什么.

 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.
Run Code Online (Sandbox Code Playgroud)

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

 my $x = (f(),g(),@a);
Run Code Online (Sandbox Code Playgroud)

是一种奇怪的写作方式

 f();
 g();
 my $x = @a;
Run Code Online (Sandbox Code Playgroud)

笔记

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