2
my @skipper = qw(blue_shirt hat jacket preserver sunscreen);
my @skipper_with_name = ('The Skipper' => \@skipper);

如何理解第二行?

print @skipper_with_name;

得到以下消息:

The SkipperARRAY(0x209cf90)
4

3 回答 3

3

前面的反斜杠@skipper获取对数组的引用。

如果您执行以下操作,则可以查看实际结构:

use Data::Dumper;
print Dumper \@skipper_with_name;

也许您想要一个哈希来代替第二个数组,这意味着它The Skipper可以用作访问的键@skipper

my %skipper_with_name = ('The Skipper' => \@skipper);
print Dumper \%skipper_with_name;
my @skipper_copy = @{$skipper_with_name{'The Skipper'}};

请注意我过去是如何@{...}取消引用数组引用的。

于 2013-04-19T08:29:45.863 回答
2

正如 Stevenl 所提到Data::Dumper的,如果您将引用传递给它,则只打印出数组或哈希的结构,而不是结构本身。否则它会打印出结构是什么(ARRAY)以及它的内存地址。

另外,如果您希望@skipper_with_name是 aHASH而不是 a ARRAY,我会指出@仅用于数组,%是 a 的符号HASH(所以它会是%skipper_with_name)。此外,虽然=>在哈希中最常用于显示键/值关系,但它本质上只是一个逗号,因此可以毫无错误地用于创建数组。

my @skipper_with_name = ('The Skipper' => \@skipper);

是相同的:

my @skipper_with_name = ('The Skipper',  \@skipper);

你可以在这里看到:

 $skipper_with_name[0] = 'The Skipper' 
 $skipper_with_name[1] = \@skipper
于 2013-04-19T08:35:29.977 回答
1

\它是一个新的 Array,它具有对存储在其中的初始数组的引用(数组前面的斜线)。如果你打印它,你只会得到内存地址,你需要首先通过再次添加@符号来取消引用它以获取哈希的内容。

然而这没有任何意义,数组只能有数字索引。您可能想要做的是使用哈希。

my %skipper_with_name = ('The Skipper' => \@skipper);

'The Skipper'现在您可以通过标识符引用数组。

print Dumper $skipper_with_name{'The Skipper'};
#or
print @{ $skipper_with_name{'The Skipper'} };
于 2013-04-19T08:34:51.683 回答