我经常使用shift来解压缩功能参数:
sub my_sub { my $self = shift; my $params = shift; .... }
不过,很多同事都在传讲这一转变其实是邪恶的。你能解释为什么我更喜欢
sub my_sub { my ($self,$params) = @_; .... }
转移?
解决方法
使用shift来解压缩参数不是邪恶的。这是一个常见的惯例,可能是处理参数的最快方法(取决于有多少参数以及如何传递参数)。这里有一个常见的场景,在这种情况下:一个简单的访问器。
use Benchmark qw(cmpthese); sub Foo::x_shift { shift->{'a'} } sub Foo::x_ref { $_[0]->{'a'} } sub Foo::x_copy { my $s = $_[0]; $s->{'a'} } our $o = bless {a => 123},'Foo'; cmpthese(-2,{ x_shift => sub { $o->x_shift },x_ref => sub { $o->x_ref },x_copy => sub { $o->x_copy },});
在我的机器上的perl 5.8.8的结果:
Rate x_copy x_ref x_shift x_copy 772761/s -- -12% -19% x_ref 877709/s 14% -- -8% x_shift 949792/s 23% 8% --
不是戏剧性的,但它是。总是在你的目标硬件上的perl版本上测试你的场景,以确定。
如果您想要移除invocant,然后调用SUPER ::方法,传递剩余的@_就是这样,shift也是有用的。
sub my_method { my $self = shift; ... return $self->SUPER::my_method(@_); }
如果我有一个很长的系列我的$ foo = shift;在函数顶部的操作,但是,我可能会考虑使用@_的大量副本。但是一般来说,如果你有一个函数或方法需要多个参数,那么使用命名参数(即捕获%args哈希中的所有@_或者期望一个哈希引用参数)是一个更好的方法。