我对如何评估->
运算符的左侧和右侧有疑问。请考虑以下代码:
#! /usr/bin/perl
use strict;
use warnings;
use feature ':5.10';
$, = ': ';
$" = ', ';
my $sub = sub { "@_" };
sub u { shift->(@_) }
sub v { my $s = shift; $s->(@_) }
say 'u', u($sub, 'foo', 'bar');
say 'v', v($sub, 'foo', 'bar');
输出:
u: CODE(0x324718), foo, bar
v: foo, bar
我希望你和你的行为相同,但他们不会。在这些情况下,我总是假设perl评估了从左到右的事情。像shift->another_method(@_)
甚至shift->another_method(shift, 'stuff', @_)
这样的代码非常常见。
如果第一个参数恰好是代码引用,为什么会中断?我在未定义/未记录的领域吗?
答案 0 :(得分:6)
->()
的操作数评估顺序未记录。它碰巧评估了LHS之前的论点(分别在下面的第3-4和第5行)。
>perl -MO=Concise,u,-exec a.pl
main::u:
1 <;> nextstate(main 51 a.pl:11) v:%,*,&,x*,x&,x$,$,469762048
2 <0> pushmark s
3 <#> gv[*_] s
4 <1> rv2av[t2] lKM/3
5 <0> shift s*
6 <1> entersub[t3] KS/TARG,2
7 <1> leavesub[1 ref] K/REFC,1
a.pl syntax OK
在同一表达式中使用和修改变量都很危险。除非您能解释以下内容,否则最好避免使用它:
>perl -E"$i=5; say $i,++$i,$i"
666
您可以使用
$_[0]->(@_[1..$#_])