我正在运行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)
来自哪里?
答案 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 perlreftut
和perldoc perlref
。
答案 3 :(得分:3)
您的代码应该是这样写的:
use strict;
use warnings;
my @foo;
push @foo, "c";
print "@foo I am done now\n";
如果要使用空变量,则无需在Perl中初始化变量。但是,您应该使用my
来声明局部变量。而且你不需要围绕内置函数的括号,只会增加混乱。