是’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哈希中的所有@_或者期望一个哈希引用参数)是一个更好的方法

相关文章

忍不住在 PerlChina 邮件列表中盘点了一下 Perl 里的 Web 应用框架(巧的是 PerlBuzz 最近也有一篇相关...
bless有两个参数:对象的引用、类的名称。 类的名称是一个字符串,代表了类的类型信息,这是理解bless的...
gb2312转Utf的方法: use Encode; my $str = "中文"; $str_cnsoftware = encode("utf-8...
  perl 计算硬盘利用率, 以%来查看硬盘资源是否存在IO消耗cpu资源情况; 部份代码参考了iostat源码;...
1 简单变量 Perl 的 Hello World 是怎么写的呢?请看下面的程序: #!/usr/bin/perl print "Hello W...
本文介绍Perl的Perl的简单语法,包括基本输入输出、分支循环控制结构、函数、常用系统调用和文件操作,...