2011-12-13 83 views
2

我開始學習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}}; 
} 
+0

的可能重複(http://stackoverflow.com/questions/296964/what-do-shift-do-in-perl) –

+0

不,這個問題不是關於'shift()'的用途,而是詢問hashref的解引用。用戶說他們知道'shift()'的用途。 – CanSpice

+0

-1在一個帖子中提出兩個問題,導致回覆/評論與哪個問題相關。 – tadmc

回答

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結構。

2

當您在Perl中調用子例程時,該子例程的參數將傳遞給@_數組中的參數。在沒有任何參數的情況下調用shift會從@_數組中獲取它的參數。因此,此代碼將$ cate1從第一個參數傳遞到preData,將$ lab1從第二個參數傳遞到preData。

2

@表示數組,%表示散列。所以,這種說法:

my @x = keys %y; 

手段採取密鑰列表從哈希y和它們分配給數組x。也就是說,如果%y爲:

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

然後@x將包括:?什麼偏移()在Perl做]

one, two, three