2014-03-28 68 views
0

更新:我知道的一切有關引用/取消引用來自這裏:http://www.thegeekstuff.com/2010/06/perl-array-reference-examples/如何取消引用哈希引用

我與圖書館的工作是(從庫文件):

Returns a reference to an array of hash references

這對我來說在概念上是有意義的(我並不陌生編程),但在功能上沒有意義(我顯然對Perl很新穎)。

下面是一些代碼:

my $Obj = QA::STK::ModuleImUsing->new(arguments, to, new); 
$Obj->createClient(); 
$Obj->sync(['/tmp/files/...']); 
my $result = $Obj->method_in_question(['/tmp/files/ff-latest.xml']); 

到目前爲止好。 $result現在擁有對數組的引用。

所以,當我這樣做:

print "Result: @{ $result} \n"; 

我得到:

Result: HASH(0x20d95b0) 

可愛!但我仍然需要取消引用散列。然而,這裏的事情變得怪怪的(或者他們已經變得奇怪了?)。

my $hash_ref = @{ $result}; 
print Dump($hash_ref)); 

我得到這個:

$VAR1 = 1; 

...這是不是我所期待的。

我的期望是錯的還是我以錯誤的方式解引用?

+0

'my $ hash_ref = @ {$ result};' - 對不起,但那應該怎麼辦?將數組賦給標量? )你爲什麼不直接拋出'$ result'本身? – raina77ow

+0

我想*它應該取消引用$ result引用的數組。既然這應該是一個哈希引用,我把它變成了一個標量。我不知道這是否是錯誤的...... – Ramy

+1

你不需要推定一個數組 - 你需要得到它的第一個元素(這是一個散列的引用)。一種可能的方法是使用這種表示法:'my $ hash_ref = $ result - > [0];' – raina77ow

回答

5

如果@$result是一個數組,那麼您的LHS必須是一個列表。否則$hashref將被分配數組大小。

my ($hash_ref) = @{ $result}; 
print Dump($hash_ref)); 
+2

這很棒,但你能解釋發生了什麼?剛剛測試過它。這工作。但爲什麼? – Ramy

+1

@Ramy,標量上下文中的數組返回其長度。 'my(...)='強制使用列表賦值運算符來評估列表上下文中的參數。 http://www.perlmonks.org/?node_id=790129 – ikegami

3
  • 我們有一個%hash
  • 對此,我們有一個散列引用$hashref = \%hash
  • 這hashref是一個數組@array = ($hashref)
  • 我們得到的數組引用內部:$arrayref = \@array

這是我們的結果:$result = $arrayref。不是讓我們反向工作:

  • @result_array = @$result
  • $result_hashref = $result_array[0]或組合:$result_hashref = $result->[0]
  • %result_hash = %$result_hashref或組合:%result_hash = %{ $result->[0] }(注意,這些使複印件)
  • 要在結果散列得到一個元素,我們可以做
    • $result_hash{$key}
    • $result_hashref->{$key}
    • $result->[0]{$key}

注意$scalar = @{ $arrayref }像您期望不起作用,因爲數組(@{ … }是)返回在標量上下文數組的長度。要在分配中強制列表上下文,請將左側放在parens中:(…) = here_is_list_context(其中是零個或多個左值的列表)。

1
my $hash_ref = @{$result}; 

相同

my @array = @{$result}; 
my $hash_ref = @array; 

這迫使陣列中通過賦值操作符,這會導致它評價爲項目陣列中的數量,或1標量環境進行評估。