Perl - 作为哈希键变量

时间:2014-06-11 09:19:25

标签: perl hash

  1. 我正在从子程序

    返回一个哈希值
    my %hash = %{subroutine()};
    
  2. 稍后我想使用哈希元素如下

    if (defined $hash{LEVEL_1_KEY}{LEVEL_2_KEY}){
    .
    .
    .}
    
  3. 这很有效。 但是如果我想尝试使用来自变量的LEVEL_1_KEY的相同元素。它不起作用。 e.g。

    my $var = "LEVEL_1_KEY";
    if (defined $hash{$var}{LEVEL_2_KEY}){
    ...
    }
    

    我做错了什么?我应该使用一些撇号,还是$ var的引号?我尝试了几件事,但还没有成功。

2 个答案:

答案 0 :(得分:7)

您的代码应该按照书面形式运行,因此您的代码中会遗漏一些内容。

我的第一个冲动是使用defined。使用existsdefined进行检查是一个红旗。这意味着您的代码使用三元或甚至二元逻辑。真实,虚假,定义和存在。更糟糕的是,它们重叠:真实也被定义; 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中取名?