2012-02-13 83 views
3

关于下面的代码段,我想知道我对几个问题的理解是否正确? 1)在$model->{in1}->{tra1}->{data}}的结构中,“in1”,“tra1”和“data”都表示不同级别散列结构的特定键。关于perl程序的一些问题

2)$#{$model->{in1}->{tra1}->{data}}代表一个数组吗?我的@cus = sort keys %cus;想要做什么?右边的“cus”和左边的“cus”是同一个东西吗?

my %cus =(); 
for my $i (0 .. $#{$model->{in1}->{tra1}->{data}}) 
{ 
    foreach my $cu (keys %{$model->{in1}->{tra1}->{data}->[$i]->{concept}} 
    { 
     $cus{$cu} = 1; 
    } 
} 
my @cus = sort keys %cus; 
+0

固定不匹配的brakets'$#(...}'和'% (...} – ikegami 2012-02-13 03:18:00

回答

5

1)

他们键不同的散列,是的。

  • in1被用作由$model引用的散列的关键。
  • tra1被用作由$model->{in1}引用的散列的关键。
  • data被用作由$model->{in1}->{tra1}引用的散列的关键。

2)

  • $#a返回阵列@a的最后一个索引。

所以

  • $#{ $ref }(或$#$ref的简称)返回@{ $ref }(或@$ref的简称)的最后一个索引,通过$ref引用的数组。

所以

  • $#{ $model->{in1}->{tra1}->{data} }返回@{ $model->{in1}->{tra1}->{data} }最后一个索引,通过$model->{in1}->{tra1}->{data}引用的数组。

3)

语句排序哈希%cus的钥匙,并将其放置在阵列@cus。不,%cus@cus不是同一个变量。

“4”)

的代码可以简化为:

my %cus; 
my $data = $model->{in1}->{tra1}->{data}; 
for my $i (0 .. $#$data) { 
    for my $cu (keys %{ $data->[$i]->{concept} }) { 
     ++$cus{$cu}; 
    } 
} 

my @cus = sort keys %cus; 

甚至:

my %cus; 
for my $data_item (@{ $model->{in1}->{tra1}->{data} }) { 
    for my $cu (keys %{ $data_item->{concept} }) { 
     ++$cus{$cu}; 
    } 
} 

my @cus = sort keys %cus; 
0
  1. 是的,你有嵌套的哈希深三。

  2. 是的,$#{...}部分表示“封闭阵列的最大索引”。你也知道...->{data}是一个(引用一个)数组,因为下一行是->{data}->[$i]

  3. @cus%cus是两个不同的变量,无关。

0

$model->{in1}->{tra1}->{data}}的结构中,“IN1”,“TRA1”和“数据”全部表示在不同水平的散列结构的特定按键。

是的。如果情况并非如此,则会出现错误。

$#($model->{in1}->{tra1}->{data}}表示数组吗?

不完全。它是数组中元素的数量(所以,散列中的数据应该是数组)。

我的@cus = sort keys %cus;的目的是做什么?

它从散列表%cus中获取所有密钥,并按字母顺序将它们排序到一个新数组中@cus

右边的“cus”和左边的“cus”是同一个东西吗?

号在Perl $cus@cus%cus和三种不同的变量。前缀表示类型。

+0

“它是一个数组中元素的数量”不是它是数组中最后一个元素的索引(它通常比元素的数量少一个)。 – 2012-02-13 15:59:26