【问题标题】:issues on a segment of Perl code一段 Perl 代码的问题
【发布时间】:2011-12-14 02:20:41
【问题描述】:

我开始学习 Perl,对下面一段 Perl 代码有疑问。

我知道“my”用于定义局部变量,“shift”用于从数组中获取头元素。让我感到困惑的是,数组在下面的代码段中来自哪里。

另外,my @positives = keys %{$lab1->{$cate1}}代表什么?

preData($cate1, $lab1)

sub preData
{
  my $cate1 = shift;
  my $lab1 = shift;

  my @positives = keys %{$lab1->{$cate1}};
}

【问题讨论】:

  • What does shift() do in Perl? 的可能重复项
  • 不,这个问题不是关于 shift() 的用途,而是关于 hashref 取消引用的问题。用户说他们知道shift() 的用途。
  • -1 用于在一篇帖子中提出两个问题,从而导致来回讨论哪些答案/cmets 与哪个问题相关。

标签: perl


【解决方案1】:

$lab1 是一个包含其他哈希引用的哈希引用。 $cate1 是某种类别键(我猜)。

$lab1->{$cate1} 是一个哈希引用。当你通过在它周围加上%{ ... } 来取消引用它时,你会得到一个哈希值。然后将此哈希传递给keys() 函数,该函数返回该哈希中的键列表。因此@positives$lab1->{$cate1} 哈希引用所引用的哈希中的键的数组。

编辑:在处理这些类型的嵌套结构时,您可能会发现通过查看数据表示更容易理解正在发生的事情。在脚本顶部添加use Data::Dumper。然后在my $lab1...my @positives... 行之间,添加:

print Dumper($lab1);
print Dumper($lab1->{$cate1});

设置@positives数组后,添加:

print Dumper(\@positives);

这应该可以让您更好地可视化数据并希望更好地理解 Perl 结构。

【讨论】:

    【解决方案2】:

    当您在 Perl 中调用子例程时,该子例程的参数会在 @_ 数组中传递给它。不带任何参数调用 shift 将从 @_ 数组中获取其参数。因此,这段代码将第一个参数中的 $cate1 获取到 preData,将第二个参数中的 $lab1 获取到 preData。

    【讨论】:

      【解决方案3】:

      @ 表示数组,% 表示哈希。所以这个说法:

      my @x = keys %y;
      

      表示从哈希 y 中获取键列表并将它们分配给数组 x。即,如果 %y 是:

      one => 1,
      two => 2,
      three => 3
      

      那么@x 将包含:

      one, two, three
      

      【讨论】:

        猜你喜欢
        • 2019-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多