请解释perl运算符的关联性

请解释perl运算符的关联性,perl,Perl,解释perl运算符的优先级和关联性。我对->和*操作符很感兴趣。两者都具有左关联性 我有下一个例子,似乎->具有正确的关联性不左如文档所述: my @args; sub call { print "call\n"; shift @args } sub test { print "test\n"; 1 } sub t4 { print "t4\n"; 4 } @args=( \&test, 2, 3 ); call()->( @args, t4 ); sub m1 { prin

解释perl运算符的优先级和关联性。我对
->
*
操作符很感兴趣。两者都具有左关联性

我有下一个例子,似乎
->
具有正确的关联性不左如文档所述:

my @args;
sub call { print "call\n"; shift @args }
sub test { print "test\n"; 1 }
sub t4 { print "t4\n"; 4 }

@args=( \&test, 2, 3 );
call()->( @args, t4 );


sub m1 { print "m1\n"; 2 }
sub m2 { print "m2\n"; 4 }

m1()*(@args, m2);
输出为:

t4
call
test
m1
m2
因为
->
已离开关联性,我希望下一个输出:

call
t4
test
m1
m2

我错过了什么?为什么在调用
之前调用
t4

关联性描述了处理多个优先级相等的运算符的顺序。它与是先处理左参数还是先处理右参数无关<代码>->
左关联意味着
a->b->c
被处理为
(a->b)->c
,而不是
a->(b->c)

关联性描述了处理多个优先级相等的运算符的顺序。它与是先处理左参数还是先处理右参数无关<代码>->左关联意味着
a->b->c
被处理为
(a->b)->c
,而不是
a->(b->c)

关联性是一条规则,告诉您如何解析一个表达式,其中同一个运算符出现两次,或者出现多个具有相同优先级的运算符。例如,关联性决定了:

foo()->bar()->baz()
相当于

(foo()->bar())->baz() # left associative
 ( ( 3 / 4 ) * 5 ) * 6 = 22.5
而不是

foo()->(bar()->baz()) # right associative
 3 / ( 4 * ( 5 * 6 ) ) = 0.025
由于代码中只有一个
->
运算符,因此该运算符的关联性是不相关的

您似乎在寻找有关操作数对
->
运算符求值顺序的规则。据我所知,对于perl中的大多数操作符(很像C),没有保证的求值顺序。如果顺序很重要,则应使用显式临时变量将表达式拆分为多个语句:

my $tmp = call();
$tmp->( @args, t4 );

关联性是一条规则,它告诉您如何解析同一运算符出现两次或出现多个具有相同优先级的运算符的表达式。例如,关联性决定了:

foo()->bar()->baz()
相当于

(foo()->bar())->baz() # left associative
 ( ( 3 / 4 ) * 5 ) * 6 = 22.5
而不是

foo()->(bar()->baz()) # right associative
 3 / ( 4 * ( 5 * 6 ) ) = 0.025
由于代码中只有一个
->
运算符,因此该运算符的关联性是不相关的

您似乎在寻找有关操作数对
->
运算符求值顺序的规则。据我所知,对于perl中的大多数操作符(很像C),没有保证的求值顺序。如果顺序很重要,则应使用显式临时变量将表达式拆分为多个语句:

my $tmp = call();
$tmp->( @args, t4 );
您询问的是操作数求值顺序(计算操作数的顺序),而不是运算符关联性(计算具有相同运算符优先级的运算符的顺序)

许多运算符的操作数求值顺序未定义(或至少未记录),包括
->
。你会发现它是一致的,但你不应该依赖它

可以使用语句分隔符强制执行所需的顺序:

my $sub = call();
$sub->( @args, t4 );
这也将有助于:

$_->( @args, t4 ) for call();

算子结合性 结合性是计算具有相同优先级的运算符的顺序

例如,
*
/
具有相同的优先级,因此关联性决定

 3 / 4 * 5 * 6
相当于

(foo()->bar())->baz() # left associative
 ( ( 3 / 4 ) * 5 ) * 6 = 22.5
而不是

foo()->(bar()->baz()) # right associative
 3 / ( 4 * ( 5 * 6 ) ) = 0.025
如您所见,关联性会直接影响表达式的结果


操作数求值顺序 操作数求值顺序是操作数求值的顺序

例如,操作数求值顺序决定是在
3+4
之前求值
1+2
,还是在
3+4
之前求值

( 1 + 2 ) * ( 3 + 4 )
除非对操作数求值有副作用(例如更改变量或打印到屏幕),否则操作数求值顺序对表达式的结果没有影响。因此,有些语言未对其进行定义,以便进行优化

在Perl中,许多操作符都没有定义(或至少没有文档记录)。仅记录了以下内容:

  • 逗号运算符(
    =>
    ):从左到右
  • 二进制布尔运算符(
    和&
    |
    /
    ):左,然后可能右[1]
  • 条件运算符(
    ?:
    ):左,然后是第二个或第三个[1]
  • 列表和标量赋值运算符(
    =
    ):右,然后左[2]
  • 绑定运算符(
    =~
    !~
    ):左,然后右[3]

  • 短路评估所需
  • my$x=$x所需
  • 完全需要发挥作用
  • 您询问的是操作数求值顺序(计算操作数的顺序),而不是运算符关联性(计算具有相同运算符优先级的运算符的顺序)

    许多运算符的操作数求值顺序未定义(或至少未记录),包括
    ->
    。你会发现它是一致的,但你不应该依赖它

    可以使用语句分隔符强制执行所需的顺序:

    my $sub = call();
    $sub->( @args, t4 );
    
    这也将有助于:

    $_->( @args, t4 ) for call();
    

    算子结合性 结合性是计算具有相同优先级的运算符的顺序

    例如,
    *
    /
    具有相同的优先级,因此关联性决定

     3 / 4 * 5 * 6
    
    相当于

    (foo()->bar())->baz() # left associative
    
     ( ( 3 / 4 ) * 5 ) * 6 = 22.5
    
    而不是

    foo()->(bar()->baz()) # right associative
    
     3 / ( 4 * ( 5 * 6 ) ) = 0.025
    
    如您所见,关联性会直接影响表达式的结果


    操作数求值顺序 操作数求值顺序是操作数求值的顺序

    例如,操作数求值顺序决定是在
    3+4
    之前求值
    1+2
    ,还是在
    3+4
    之前求值

    ( 1 + 2 ) * ( 3 + 4 )
    
    除非对操作数求值有副作用(例如更改变量或打印到屏幕),否则操作数求值顺序对