为什么我看见哈希(0xABCDEF)在我的Perl输出?
-
22-08-2019 - |
题
我正在运行perl5.6.1建sun4-solaris64int
我呼吁印在一个阵列:
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)
来自何处?
解决方案
您在@foo括号= {}创建它。括号创建一个无名散列引用。
如果要@foo设置为空列表,使用@foo =()
其他提示
要了解这类问题的关键是,你在输出中获得额外的项目。这不是太重要的项目是什么。
在一般情况下,你会想要做的,当你的容器变量有更多(或更少),它比预期的第一件事是看它的内容。数据::自卸车模块自带Perl和几乎可以为您的打印数据结构:
use Data::Dumper;
print Dumper( \@foo );
一旦你看到的就是你的货柜里,你就可以开始工作落后,找出它在那里是如何得到。你会最终落得注意到,您初始化@foo,它已经有一个元素,这是不是你想要的东西之后。
另一个窍门是检查在列表中的元素数:
print "There are " . @array . " elements in \@array\n";
如果你得到一个数字,你不要指望,工作落后找出来的时候,额外的元素出现了。
你不小心有一散列参考@foo。当你打印一个参考出没有取消引用它(几乎总是通过事故),你会得到一个调试string(类型的参考和存储位置)。
我觉得你想要的 my @foo = (); push @foo, "c";
而不是什么你现在有。另一方面,你也可以简单地说 my @foo;
创建该阵列。你不需要明确标记为空白带 ()
.
看看 perldoc perlreftut
和 perldoc perlref
欲了解更多有关参考文献。
您的代码应该这样写:
use strict;
use warnings;
my @foo;
push @foo, "c";
print "@foo I am done now\n";
您不必在Perl初始化变量,如果你想有一个空的变量。然而,你应该使用my
声明一个局部变量。而且你不需要的括号内置的功能,只是添加了混乱。
不隶属于 StackOverflow