是’shift’邪恶处理Perl子程序参数?

前端之家收集整理的这篇文章主要介绍了是’shift’邪恶处理Perl子程序参数?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我经常使用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哈希中的所有@_或者期望一个哈希引用参数)是一个更好的方法

猜你在找的Perl相关文章