为什么我的Perl输出中会看到HASH(0xABCDEF)?

时间:2009-04-02 13:28:01

标签: perl reference stringification

我正在运行perl,为sun4-solaris-64int构建的v5.6.1

我在数组上调用print:

print "@vals\n";

,输出如下:

HASH(0x229a4) uid cn attuid

或其他例子:

@foo = {};
push(@foo, "c");

print "@foo I am done now\n";

输出:

HASH(0x2ece0) c I am done now

HASH(0x2ece0)来自哪里?

4 个答案:

答案 0 :(得分:14)

@foo = {}中的大括号正在创建它。大括号创建一个未命名的哈希引用。

如果要将@foo设置为空列表,请使用@foo =()

答案 1 :(得分:6)

理解这类问题的关键是你在输出中得到一个额外的项目。这个项目是什么并不太重要。

一般情况下,当容器变量中的容器变量多于(或少于)时,您要做的第一件事就是查看它的内容。 Data :: Dumper模块附带Perl,可以为您打印数据结构:

use Data::Dumper;
print Dumper( \@foo );

一旦你看到你的容器里有什么东西,你就可以开始向后工作,看看它是如何进入的。你最终注意到在你初始化@foo之后它已经有了一个元素,这不是你想要的。

另一个技巧是检查列表中的元素数量:

print "There are " . @array . " elements in \@array\n";

如果你得到一个你不想要的数字,那就向后工作,找出多余元素出现的时间。

答案 2 :(得分:4)

你不小心在@foo中有一个哈希引用。当你打印出一个引用而没有解除引用时(几乎总是偶然),你得到一个调试字符串(它的引用类型和内存位置)。

我认为你想要的是my @foo = (); push @foo, "c";,而不是你现在所拥有的。另一方面,您也可以简单地说my @foo;来创建数组。您无需使用()将其明确标记为空。

有关参考文献的详情,请参阅perldoc perlreftutperldoc perlref

答案 3 :(得分:3)

您的代码应该是这样写的:

use strict;
use warnings;

my @foo;
push @foo, "c";

print "@foo I am done now\n";

如果要使用空变量,则无需在Perl中初始化变量。但是,您应该使用my来声明局部变量。而且你不需要围绕内置函数的括号,只会增加混乱。