【问题标题】:What does shift() do in Perl?在 Perl 中 shift() 有什么作用?
【发布时间】:2010-09-22 18:08:44
【问题描述】:

下面这行可能是什么意思?

my $x = shift;

【问题讨论】:

  • Perl 为每个标准函数提供了内置文档。他们也在线。在这种情况下,“perldoc -f shift。”
  • 他是否用谷歌搜索并不重要。这是一个很好的问题,绝对应该成为 Stack Overflow 数据库的一部分。
  • @friedo - 100% 同意!这不应该成为“给我读文档”的网站。
  • perldoc -f shift 包含来自“perlfunc”的有用信息。见perfun,甚至perlfun: shift()。没有一个答案在链接/从文档中提取方面做得很好。因此,无论是否“RTFM”,都应该包含参考。

标签: perl built-in


【解决方案1】:

shift() 是一个内置的 Perl 子例程,它接受一个数组作为参数,然后返回并删除该数组中的第一项。通常的做法是通过shift 调用获取传递给子例程的所有参数。例如,假设您有一个接受三个参数的子例程foo。将这些参数分配给局部变量的一种方法是使用shift,如下所示:

sub foo() {
  my $x = shift;
  my $y = shift;
  my $z = shift;
  # do something
}

这里的困惑是,似乎 shift 没有作为参数传递给数组。事实上,它被隐式传递给“默认”数组,即子程序内的@_ 或子程序外的@ARGV

【讨论】:

  • 或@ARGV,如果你不在一个函数中(见我的回答)
  • 您不希望在子名称之后使用“()” - 它应该是“子 foo {...”。使用 '()' 你是说 foo 不接受任何参数,在这种情况下这不是你想要的
  • 我自己更喜欢使用sub foo{ my($x,$y,$z) = @_ },它的重复性较低。
【解决方案2】:

shift 函数从数组中删除第一个元素并将其返回。数组缩短了一个元素。

如果您在函数中,默认数组(如果没有作为参数给出)是@_,如果您在文件范围内,默认数组是@ARGV

所以在这种情况下,$x 要么设置为第一个函数参数,要么设置为第一个命令行参数。

【讨论】:

  • 需要补充的是@_是包含给函数的参数的数组,@ARGV是包含给程序的参数的数组。
【解决方案3】:

在 Perl 中,如果您没有明确指定参数,许多方法会使用默认变量($_@_)。您的代码与以下内容相同:

my $x = shift @_;

正如 PullMonkey 之前指出的,在子例程中,@_ 包含传递给该子例程的参数(如perlsub 中所述)。 shift 将从@_ 中删除第一个参数值并将其存储在$x 中,因此$_[0] 现在将为您提供传递给子例程的第二个 参数。

【讨论】:

    【解决方案4】:

    这通常是一个习惯用法:$x 是分配给传递给子例程的第一个参数的局部变量。

    my ($x) = @_;
    

    可能更清楚(并且它不会修改参数列表)。

    【讨论】:

      【解决方案5】:

      通俗地说,从非常高级的角度来看,shift 是取数组的第一个元素(最左边的部分),而相反的是 pop 取数组的最后一个元素(最右边的部分)。

      我的@array1=(5,6,7,8,9); 我的 $x = shift @array1; 打印 "$x\n"; # 5 打印“@array1\n”; # 6 7 8 9

      【讨论】:

        【解决方案6】:

        如果您在子例程中,则此行将在 @_shift(传入的参数)。
        所以$x 将是@_ 数组中的第一项popped

        所以通常你会看到$x = shift if @_;

        【讨论】:

        • 不需要 if。 “我的 $x = 班次;”和“我的 $x; $x = shift if @_;”是等价的,如果@_ 为空,都将导致 $x 为 undef,也不会违反严格或发出警告。唯一的区别是您必须输入的数量。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-14
        • 2012-04-18
        • 1970-01-01
        • 1970-01-01
        • 2011-06-22
        相关资源
        最近更新 更多