我正在从子程序
返回一个哈希值my %hash = %{subroutine()};
稍后我想使用哈希元素如下
if (defined $hash{LEVEL_1_KEY}{LEVEL_2_KEY}){
.
.
.}
这很有效。 但是如果我想尝试使用来自变量的LEVEL_1_KEY的相同元素。它不起作用。 e.g。
my $var = "LEVEL_1_KEY";
if (defined $hash{$var}{LEVEL_2_KEY}){
...
}
我做错了什么?我应该使用一些撇号,还是$ var的引号?我尝试了几件事,但还没有成功。
答案 0 :(得分:7)
您的代码应该按照书面形式运行,因此您的代码中会遗漏一些内容。
我的第一个冲动是使用defined
。使用exists
或defined
进行检查是一个红旗。这意味着您的代码使用三元或甚至二元逻辑。真实,虚假,定义和存在。更糟糕的是,它们重叠:真实也被定义; undefined也是假的;存在与任何其他人结合;等等。有一些有效的用途可用于检查事物是否为defined
,但随意使用会让人感到困惑和容易出错。伪值很容易潜入一个应该保持未定义的槽。考虑将定义的检查更改为真值检查。
(defined
的主要用途是0或''
是有效值。
这是一般的调试思路。
$var
是否包含您认为包含的内容?在使用之前将其打印出来。
$var
真的是否包含您认为包含的内容?使用引号打印,如print qq['$var']
,以捕获任何尾随空格。
$var
真的 真的是否包含您认为包含的内容?它来自文件句柄吗?它可能包含看起来像纯ASCII的特殊Unicode吗?试试print "Yes" if $var eq "LEVEL_1_KEY"
$var
周围没有单引号吗?这是$hash{$var}
对吗?不是$hash{'$var'}
。
%hash
是否包含您认为包含的内容?在使用之前使用Data :: Dumper将其转储出来。
在条件之前打印一份打印声明。
可能条件正常,但块内的代码却没有。在条件之后将打印在块中。
您正在检查定义的值,而不是真的。它可能是一个空字符串。它可能是所有空间。它可能是0.其余代码是否需要定义值或真值?
作为旁注,您最好将子例程的返回值保留为哈希引用,而不是取消引用它。取消引用会导致生成散列的临时副本,该副本可以使用CPU和内存。这将产生多大的影响取决于哈希的大小,你应该习惯使用引用来提高效率。
答案 1 :(得分:0)
您的代码中存在拼写错误
if (defined $hash{LEVEL_1_KEY}{LEVEL_2_KEY){
应该是
if (defined $hash{LEVEL_1_KEY}{LEVEL_2_KEY}){
休息时效果很好,你可以在这里查看:http://ideone.com/QT36e4
你确定你正在写你所说的$ var,或者你是从某个文件或STDIN中取名?