=和,Perl中的运算符

Lit*_*rat 4 perl

请解释这个明显不一致的行为:

$a = b, c;
print $a; # this prints: b

$a = (b, c);
print $a; # this prints: c
Run Code Online (Sandbox Code Playgroud)

Eug*_*ash 16

=运营商的优先级高于,.并且逗号运算符抛弃其左参数并返回正确的参数.

请注意,逗号运算符的行为取决于上下文.来自perldoc perlop:

二进制","是逗号运算符.在标量上下文中,它评估其左参数,抛出该值,然后计算其右参数并返回该值.这就像C的逗号运算符一样.

在列表上下文中,它只是列表参数分隔符,并将其参数插入列表中.这些参数也从左到右进行评估.

  • 左参数:`$ a ="b"`,右参数:`"c"`.left得到评估,所以$ a包含"b",右边返回.因为你不接受返回的值,所以没有任何反应. (5认同)
  • 在标量上下文中它确实如此. (2认同)

mat*_*ull 8

由于eugene的答案似乎留下了OP的一些问题,我试着解释一下:

$a = "b", "c";
print $a;
Run Code Online (Sandbox Code Playgroud)

左边的参数是$a = "b"因为=它的优先级高于,首先评估的优先级.之后$a包含"b".

正确的论点是"c",并将在我即将展示时返回.

在您打印时,$a它显然会打印b到您的屏幕上.

$a = ("b", "c");
print $a;
Run Code Online (Sandbox Code Playgroud)

这里("b","c")将首先评估该术语,因为括号的优先级更高.它返回"c",并将分配给$a.

所以在这里打印"c".

$var = ($a = "b","c");
print $var;
print $a;
Run Code Online (Sandbox Code Playgroud)

这里$a包含"b"并$var包含"c".

一旦获得优先规则,这就完全一致了