2016-10-27 25 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

相关问题