【发布时间】:2023-03-14 12:07:01
【问题描述】:
(关于重复:有针对性的讨论是相关的,但目标不同:那个作者正在寻找一种方法来找到所有发生这种情况的地方,虽然我知道所有这些地方,但正在寻找一种方法来避免这种行为!因此,虽然阅读“重复”具有教育意义,但这个问题是不同的!)
我的问题是,当我尝试检查某些分支是否存在时,perl 脚本(正如我目前所做的那样)会创建空分支。
我正在使用多维哈希:发现它是处理我需要处理的信息的最佳方式。 说多维我的意思是哈希的哈希...... 所以,我有
$hsh{k1}{k2}{k3}{k4}=v1;
$hsh{k1}{k9}{k3}{k33}=v2;
....
在某些时候,我需要检查哈希中是否存在一些“键集”。 所以,我检查:
if ( $hsh{ch1}{ch2}{ch3} ) { ...something... }
而且,我突然意识到,这样的检查会创建中间分支来访问最后一个进行检查!
所以,如果检查前没有$hsh{ch1},则会创建访问密钥'ch2',创建访问密钥'ch3'
问题: 有没有办法避免这种芳香的产生????
从逻辑上讲,我希望 Perl 会在哈希中不存在任何键时立即获得 FALSE,但这并没有发生!
当然可以:
if ( $hsh{ch1} && $hsh{ch1}{ch2} && $hsh{ch1}{ch2}{ch3} )
{...}
但这太烦人了,尤其是当我有许多带有 7-10 个键的哈希时!
我创建了一些函数来“合理地”检查哈希,发送哈希引用和要检查的键数组,它工作正常,但它明显减慢了处理速度。
这是我所说的一个例子:
DB<4> $h{a}{b}=[1,2]; $h{a}{c}=[3,4] #hash with two elements (arrays) and in 2 levels
DB<5> use Data::Dumper #good way to display
DB<6> p Dumper\($a,%h)
$VAR1 = \undef;
$VAR2 = {
'a' => {
'c' => [
3,
4
],
'b' => [
1,
2
]
}
};
DB<7> p 'da' if !$h{p}{m} #checking for an existent keys and element
da
DB<8> p Dumper\($a,%h)
$VAR1 = \undef;
$VAR2 = {
'p' => {}, # <<== created one !!!
'a' => {
'c' => [
3,
4
],
'b' => [
1,
2
]
}
};
DB<9> delete $h{p}
再说一遍:有没有办法在不创建额外功能的情况下避免这种行为?
【问题讨论】:
标签: perl hash build-automation