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..$#_])