Perl - 作为哈希键变量

tai*_*iko -2 perl hash

  1. 我正在从子程序返回一个哈希值

    my %hash = %{subroutine()};
    
    Run Code Online (Sandbox Code Playgroud)
  2. 后来我想使用hash元素如下

    if (defined $hash{LEVEL_1_KEY}{LEVEL_2_KEY}){
    .
    .
    .}
    
    Run Code Online (Sandbox Code Playgroud)

这很好用.但是如果我想尝试使用来自变量的LEVEL_1_KEY的相同元素.它不起作用.例如

my $var = "LEVEL_1_KEY";
if (defined $hash{$var}{LEVEL_2_KEY}){
...
}
Run Code Online (Sandbox Code Playgroud)

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

Sch*_*ern 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将其转储出来.

  • 甚至达到了那行代码?

在条件之前打印一份打印声明.

  • 条件阻止做什么吗?

也许条件有效,但块内的代码却没有.在条件之后立即在块放置一个print语句.

  • 仅仅因为它的定义并不意味着它是真的.

您正在检查定义的值,而不是真的.它可能是一个空字符串.它可能是所有空间.它可能是0.其余代码是否需要定义值或真值?

作为旁注,您最好将子例程的返回值保留为哈希引用,而不是取消引用它.取消引用会导致生成散列的临时副本,该副本可以使用CPU和内存.这将产生多大的影响取决于哈希的大小,你应该习惯使用引用来提高效率.

  • +1 Thanx花时间尝试教授如何调试.教别人捕鱼必须至少比给他一条鱼更难10倍,但我认为你做了很好的沟通调试步骤,这些步骤对于我们大多数人来说是天生的,他们实际上很难描述. (2认同)