【问题标题】:Perl variable definitionPerl 变量定义
【发布时间】:2019-09-13 05:14:21
【问题描述】:

所以我几乎没有使用 Perl 的经验,在工作中我必须分析一些混乱的 Perl 代码并找出错误。由于 $_ 的大量使用令人困惑,我很难理解代码。因此,如果您对如何快速进入 Perl 有任何建议,请告诉我。但这不是我的主要问题。

我刚刚碰到了一行我看不懂的代码。它位于所有库列表之后的 Perl 模块中。所以这是行:

my (@array1,@array2) = ()

稍后,在以下情况下,在使用哈希作为参数调用的构造函数内部使用数组之一:

my ($object,$anyHashReference) = @_;
@array2 = someValue;
foreach (keys %{$anyHashReference})
{
    push(@array1,$_);
    push(@array1,$anyHashReference->{$_});
}
return bless {}, $object;

所以我不明白的是,多个变量的变量声明究竟是什么以及在这种情况下 push 函数做了什么。

提前致谢!

【问题讨论】:

    标签: arrays perl hash


    【解决方案1】:

    my 的变量定义为当前词法范围声明这些变量,而在较小的范围内(例如在 foreach 循环或子例程中)这样做意味着它们在它之外不可用,并且每次迭代都会获取该变量的新实例。 (词法范围定义了您在源代码中可见的内容,它由块 {} 或文件本身限定。)这里的 = () 实际上什么都不做,因为数组开始时已经是空的了。

    foreach 循环将列表中的每个元素别名为$_,因为没有向它提供任何变量。它也可以写成foreach my $key (keys %{$anyHashReference}),然后你可以使用$key 而不是$_,这实际上更安全,因为它不依赖于全局变量。 $_ 的文档列出了最终可能使用它的所有核心功能。

    在任何一种情况下,这些push 语句都将当前项添加到@array1,然后将哈希引用中的值添加到该键。

    【讨论】:

    • 非常感谢,但还有一件事我不明白。在定义中将两个变量写入括号的结果是什么。它是否以某种方式将这两个变量相互联系起来,或者这也会导致什么?
    • 不,这只是一次声明两者的便捷方式,而不是两个单独的 my 语句。唯一的区别是是否为它们分配了有意义的东西,就像您分配给该变量列表一样。 (当它们都是数组时,这不是很有用,因为第一个数组将获取所有值,而第二个仍然是空的。)
    【解决方案2】:

    以下三个sn-ps是等价的:

    my $x;
    my $y;
    ($x, $y) = foo();
    

    (my $x, my $y) = foo();
    

    my ($x, $y) = foo();
    

    在任何情况下,赋值右侧表达式返回的第一个标量分配给$x,第二个分配给$y。 (忽略任何额外内容。)


    当被赋值的变量之一是数组(或哈希)时,会有一个问题。

    my (@a, ...) = foo();
    

    Perl 不知道 RHS 返回的标量中有多少应该分配给数组,又有多少标量应该分配给后面的变量,所以它将它们全部分配给数组。

    这意味着以下是等价的:

    my @a;
    my @b;
    @a = foo();
    

    (my @a, my @b) = foo();
    

    my (@a, @b) = foo();
    

    my @a = foo();
    my @b;
    

    显然,最后一个最清楚。


    最后,让我们看看您的具体情况。你有

    my (@array1, @array2) = ();
    

    如上所述,这相当于

    my @array1 = ();
    my @array2;
    

    由于 Perl 创建空数组[1],我们可以简单地写

    my @array1;
    my @array2;
    

    通过结合这些,我们可以使代码更紧凑。

    my (@array1, @array2);
    

    这两个最终选项都很好,但我认为作者使用的那个你的代码非常糟糕。它具有误导性和不必要的噪音。


    1. 哈希也创建为空,标量创建为未定义。

    【讨论】:

      猜你喜欢
      • 2014-09-17
      • 2015-03-28
      • 1970-01-01
      • 1970-01-01
      • 2015-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多