加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 21:22:16 所属栏目:大数据 来源:网络整理
导读:我经常使用shift来解压缩功能参数: sub my_sub { my $self = shift; my $params = shift; ....} 不过,很多同事都在传讲这一转变其实是邪恶的。你能解释为什么我更喜欢 sub my_sub { my ($self,$params) = @_; ....} 转移? 解决方法 使用shift来解压缩参数
我经常使用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哈希中的所有@_或者期望一个哈希引用参数)是一个更好的方法。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读