2

我正在运行 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

4 回答 4

14

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

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

于 2009-04-02T13:30:52.700 回答
6

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

一般来说,当你的容器变量比你预期的多(或少)时,你要做的第一件事就是查看它的内容。Perl 附带的 Data::Dumper 模块可以为您漂亮地打印数据结构:

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

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

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

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

如果您得到一个您不期望的数字,请向后工作以找出额外元素何时出现。

于 2009-04-02T14:20:29.570 回答
4

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

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

有关参考perldoc perlreftutperldoc perlref更多信息,请参阅。

于 2009-04-02T13:37:25.960 回答
3

你的代码应该这样写:

use strict;
use warnings;

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

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

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

于 2009-04-02T13:46:01.337 回答