我正在从子程序返回一个哈希值
my %hash = %{subroutine()};
Run Code Online (Sandbox Code Playgroud)后来我想使用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的引号?我尝试了几件事,但还没有成功.
您的代码应该按照书面形式工作,因此您的代码中会遗漏一些内容.
我的第一个冲动是使用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和内存.这将产生多大的影响取决于哈希的大小,你应该习惯使用引用来提高效率.
| 归档时间: |
|
| 查看次数: |
528 次 |
| 最近记录: |