Perl 移位和解引用运算符出现故障

Perl 移位和解引用运算符出现故障,perl,Perl,我有一个关于如何计算->运算符的左侧和右侧的问题。考虑下面的代码: #! /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'

我有一个关于如何计算
->
运算符的左侧和右侧的问题。考虑下面的代码:

#! /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
我希望u和v的行为相同,但事实并非如此。在这种情况下,我总是假设perl从左到右进行计算。像shift->other_method(@_)甚至shift->other_method(shift,'stuff',@_)这样的代码都很常见


如果第一个参数恰好是代码引用,为什么会中断?我在这里是在未定义/未记录的区域吗?

的操作数求值顺序是未记录的。它恰好在LHS之前计算参数(下面分别是第3-4行和第5行)

你可以用

$_[0]->(@_[1..$#_])

这只是一个部分答案:虽然只有一个
->
操作符被记录,
->()
->[]
->{}
->方法
实际上是作为完全不同的操作符实现的。@robarl,我的答案是在方法调用之前对参数进行评估(这是一个很简单的问题),在LHS之前没有。即使
->()
的工作方式与方法调用相同,这在这里也没有帮助。@robarl,有趣的是,
->method(@args)
的LHS是在args之前计算的,因此
shift->foo(@41;
的工作方式与预期的一样!(可能是因为这是一个非常吸引人的常规操作,所以它值得额外的前端堆栈使用。)
>perl -E"$i=5; say $i,++$i,$i"
666
$_[0]->(@_[1..$#_])