2012-06-15 36 views
2

我搜索的SO問這個問題之前,我完全新的這一點,不知道如何處理這些錯誤。我的意思是Perl語言。哈希作爲參考被棄用

當我把這個

%name->{@id[$#id]} = $temp; 

我得到的錯誤Using a hash as a reference is deprecated

我試圖

$name{@id[$#id]} = $temp 

,但不能得到任何結果回來。

有什麼建議嗎?

+0

什麼樣的變量是「名稱」?它在哪裏首先被初始化,它包含什麼樣的數據?如果不知道,不能幫助你。雖然,我會說 - >是解引用操作符,它只適用於包含引用的$標量,而不是%哈希,因此也是錯誤。 –

+0

我通過執行'my%name;'初始化它在代碼的頂部# – Grigor

+0

@Grigor嘗試'$ name {$ id [$#id]} = $ temp' – starbolin

回答

8

訪問散列%name的元件正確的方法是$name{'key'}。語法%name->{'key'}在Perl v5.6中有效,但此後不推薦使用。

同樣,要訪問數組@id的最後一個元素,您應該編寫$id[$#id]或更簡單地說,$id[-1]

您的第二個版本應該可以正常工作,而您無法檢索該值具有不相關的原因。

$name{$id[-1]} = 'test'; 

print $name{$id[-1]}; 

將顯示test正確

-2

如果你想從一個數組或哈希使用$一個項目。有關項目列表,請分別使用@和%。你使用@作爲引用返回一個列表,而不是perl可能被解釋爲散列的項目。

此代碼演示了您對數組散列的引用。

#!/usr/bin perl -w 
my %these = ('first'=>101, 
      'second'=>102, 
      ); 
my @those = qw(first second); 
print $these{$those[$#those]}; 

打印 '102'

+0

這是錯誤的。你不能使用'%'從任何東西中提取列表。 Perl永遠不會將列表解釋爲哈希。 – Borodin

+0

@Borodin我們可能會爭論symantics,但是'perl -e'%these = qw(foo 0 bar 1); print join(「:」,%these)''在兩個方面都可以正常工作。 – starbolin

+0

@Borodin Perl顯然沒有將列表解釋爲散列,因爲它通過一個錯誤。 – starbolin

4
%name->{...} 

一向車。它沒有做它應該做的事情。因此,它現在會在您嘗試使用它時發出警告。正確的方法來索引哈希

$name{...} 

因爲你已經相信了。


現在,你說

$name{@id[$#id]} 

不起作用,但即便如此,這是因爲一個錯誤的代碼別的地方的。該代碼最肯定的作品

>perl -wE"@id = qw(a b c); %name = (a=>3, b=>4, c=>5); say $name{@id[$#id]};" 
Scalar value @id[$#id] better written as $id[$#id] at -e line 1. 
5 

正如警告說,雖然適當的方式來索引數組不

@id[...] 

它實際上

$id[...] 

最後,獲取數組的最後一個元素的最簡單方法是使用索引-1。這意味着你的代碼應該是

$name{ $id[-1] } 
-1

最流行的答案是隻是不取消引用,但這是不正確的。換言之,%$hash_ref->{$key}%$hash_ref{$key}不可互換。前者需要訪問嵌套爲另一個散列引用中元素的散列引用。

對於很多衛星來說,它已經是嵌套哈希引用的常見位置。事實上,有幾個模塊解析數據並將其存儲在這種數據結構中。立即貶低沒有模塊更新的行爲並不是一件好事。有時我的數據被困在一個嵌套的散列中,唯一的辦法就是做類似的事情。

$new_hash_ref = $target_hash_ref->{$key1} 
$new_hash_ref2 = $target_hash_ref->{$key2} 
$new_hash_ref3 = $target_hash_ref->{$key3} 

,因爲我不能

foreach my $i(keys(%$target_hash_ref)) { 
    foreach(%$target_hash_ref->{$i} { 
     #do stuff with $_ 
    } 
} 

了。

是的,上面有點奇怪,但爲了避免以某種方式訪問​​數據結構而創建新的變量更糟糕。我錯過了什麼嗎?