2016-10-27 32 views
0

我有一個內部數組的樣本散列,但它似乎是我訪問數組元素的錯誤。我這樣做:Perl:如何訪問散列中的數組

%Hash_Object = (
    "Property1","value-1", 
    "Property2",("value-2","value-3") 
); 

print $Hash_Object{Property2}[1]; 
#blank output! 

它應該打印出「價值-3」,但它沒有。

+4

時,你不必在你的哈希的數組。你有一個列表。我正在尋找一個有很好解釋的副本。同時,您需要在散列分配中使用'[]'。 – simbabque

+1

相關但不重複:http://stackoverflow.com/q/40044519/1331451 – simbabque

+1

'%Hash_Object =( 「Property1」,「value-1」, 「Property2」,[「value-2」,「值-3「] );' – ssr1012

回答

3

你不必在你的哈希的數組。你有一個列表。請注意以下事項:

  • 列表是不一樣的Perl中數組
  • 列表是扁平結構
  • 數組是列出

如果你把一個數組列表,它將被視爲另一個列表,並且列表是扁平:

(1, 2, (3, 4, 5), (6, (7))) 

等於

(1, 2, 3, 4, 5, 6, 7) 

如果你想構建更復雜的數據結構,你需要使用引用。有兩種方法可供參考。您可以通過使用\這樣

my @foo = qw(a b c); 
my $ref = \@foo; 

或直接構建爲一個匿名引用,你然後將分配給一個變量引用變量。

my $ref = [ qw(a b c) ]; 
my $ref2 = [ 1, 2, 3 ]; 

要製作哈希引用,請使用大括號{}

my $ref = { a => 1, b => 2 }; 

引用是標量值,所以它們本身就是一個單一的值。這就是爲什麼你需要解引用他們,以達到其中其中的值(其實它不在裏面,它是引用)。

%Hash_Object = (
    "Property1","value-1", 
    "Property2",["value-2","value-3"] 
); 
$Hash_Object{Property2}[1]; 
$Hash_Object{Property2}->[1]; # or like this with -> 

你已經知道如何做到這一點。您還可以在每個新的解除引用之前使用->運算符。有些人發現更清晰的閱讀。

欲瞭解更多信息,請參閱perlreftut和perlref以及Mike Friedman's excellent blog post about lists and arrays


你的例子不是很好寫的代碼。這是一些改進。

  • 變量名應該是小寫
  • 使用脂肪逗號=>哈希分配
  • 你不需要雙引號""如果你不插
  • 始終把逗號後最終元素
  • 不命名他們是什麼類型的東西,將它們命名爲它們代表的內容
  • 散列不是一個obj ECT
  • 你需要使用my聲明一個新的變量

my %example = (
    Property1 => 'value-1', 
    Property2 => [ 
     'value-2', 
     'value-3', 
    ], 
); 
0

數組值應該是在方括號中,由於simbabque

%Hash_Object = (
    "Property1","value-1", 
    "Property2",["value-2","value-3"] 
); 

print $Hash_Object{Property2}[1]; 
+1

「數組值應該放在方括號中」 - 當然,只有當您想要引用該數組時(在這種情況下您會這樣做,因爲您正在構建複雜的數據結構)。 –

2

始終使用使用警告;使用嚴格;在程序的頂部。

如果您使用此它顯示了以下錯誤

Odd number of elements in hash assignment at array.pl line 3. 
Can't use string ("value-2") as an ARRAY ref while "strict refs" in use at array.pl line 8 

在Perl,其中單是壓扁在一起

所以第一誤差是

Odd number of elements in hash assignment at array.pl line 3 

哈希必須具有對鍵和值的。所以哈希的元素不應該是奇數。

你的代碼應該是

use warnings; 
use strict; 
my %Hash_Object = (
    "Property1"=>["value-1"], 
    "Property2"=>["value-2","value-3"] 
); 

print $Hash_Object{Property2}[1]; 
+0

我甚至沒有看到奇數。發現得好。 – simbabque

+0

最後一個假設每個元素應該是數組引用是不正確的。你不知道OP是否想要。他們只是表明'Property2'中有一個_ array_。 – simbabque

+0

@simbabque感謝您的評論。剛纔我知道了。 – mkHun

相關問題