2012-02-13 148 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