关于一段Perl代码的问题

时间:2011-12-13 18:08:19

标签: perl

我开始学习Perl,并对以下Perl代码段提出疑问。

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

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

preData($cate1, $lab1)

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

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

3 个答案:

答案 0 :(得分:5)

$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结构。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

@表示数组,%表示哈希。所以这句话:

my @x = keys %y;

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

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

然后@x将包含:

one, two, three