如何在Perl中访问存储在哈希中的数组元素?

时间:2009-11-24 21:40:49

标签: perl hash perl-data-structures

  # I have a hash 
  my %my_hash;

 # I have an array
  @my_array = ["aa" , "bbb"];

 # I store the array in my hash
  $my_hash{"Kunjan"} = @my_array;

 # But I can't print my array's element
  print $my_hash{"Kunjan"}[0];

我是Perl的新手。请帮帮我。

5 个答案:

答案 0 :(得分:14)

您的数组语法不正确。您正在创建匿名列表引用,@my_array是包含该引用的单元素列表。

您可以正确使用引用,作为标量:

$my_array = ["aa" , "bbb"];
$my_hash{"Kunjan"} = $my_array;

或者您可以将列表作为列表使用,只有在将其放入哈希时才创建引用:

@my_array = ("aa" , "bbb");
$my_hash{"Kunjan"} = \@my_array;

答案 1 :(得分:10)

如果您只将它放在脚本的顶部:

use strict;
use warnings;

...你会得到一些错误信息表明错误:

Global symbol "@my_array" requires explicit package name at kunjan-array.pl line 8.
Global symbol "@my_array" requires explicit package name at kunjan-array.pl line 11.

所以,首先用my @my_array;声明数组,然后你会得到:

Can't use string ("1") as an ARRAY ref while "strict refs" in use at kunjan-array.pl line 14.
  • 您创建了一个arrayref并尝试将其分配给数组 - 请参阅perldoc perldata了解如何声明数组
  • 您试图将数组分配给哈希(您只能分配标量,例如数组引用 - 有关引用的详情,请参阅perldoc perlref
  • 您需要取消引用哈希元素以获取数组元素,例如: $my_hash{"Kunjan"}->[0] - 再次查看perldoc perlref如何取消引用hashref

答案 2 :(得分:3)

您的计划中有一些错误:

my @my_array = ("aa" , "bbb");
$my_hash{"Kunjan"} = \@my_array;
print $my_hash{"Kunjan"}[0];

我做了三处修改:

  1. 在第一行的my前面添加了@my_array
  2. 将第一行的[...]更改为(...)
  3. 在第二行的@my_array前面添加\

答案 3 :(得分:0)

尝试以下修正案:

my %my_hash;

# ["aa" , "bbb"] produces an array reference.  Use () instead
my @my_array = ("aa" , "bbb");

# 'Kunjan' hash is given reference to @my_array
$my_hash{ Kunjan } = \@my_array;

# bareword for hash key is nicer on the eye IMHO
print $my_hash{ Kunjan }[0];


但是,如果使用此方法,还有一件事需要考虑:

unshift @my_array, 'AA';
print $my_hash{ Kunjan }[0];    # => AA - probably not what u wanted!


所以你可能会追求的是:

$my_hash{ Kunjan } = ["aa" , "bbb"];

然后哈希不再引用@my_array。

/ I3az /

答案 4 :(得分:0)

其他人已经很好地解释了什么是什么,但我想补充一点,(特别是如果你是Perl的新手),如果你花一些时间阅读perldsc和{{3文档。