5
  # 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 的新手。请帮我。

4

5 回答 5

14

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

您可以以标量的形式正确使用引用:

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

或者您可以将列表用作列表,仅在将其放入散列时创建引用:

@my_array = ("aa" , "bbb");
$my_hash{"Kunjan"} = \@my_array;
于 2009-11-24T21:46:44.190 回答
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了解如何声明一个数组
  • 您尝试将数组分配给哈希(您只能分配标量,例如 arrayref - 有关参考的更多信息,请参见perldoc perlref
  • 您需要取消引用哈希元素以获取数组元素,例如$my_hash{"Kunjan"}->[0]- 再次查看perldoc perlref以了解如何取消引用 hashref
于 2009-11-24T21:55:48.330 回答
3

您的程序中有一些错误:

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

我做了三个改变:

  1. 在第一行my前面添加@my_array
  2. 在第一行更改[...](...)
  3. \在第二行的@my_array 前面添加一个
于 2009-11-24T21:45:02.850 回答
0

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

于 2009-11-24T22:09:24.037 回答
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/

于 2009-11-24T21:55:44.977 回答