我开始学习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}};
}
答案 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