perl:限制perl在检查时自动创建散列分支
(关于重复:有针对性的讨论是相关的,但目标不同:作者正在寻找一种方法来找到所有发生此类事件的地方,虽然我知道所有这些地方,但正在寻找一种方法来避免此类行为!因此,尽管读到“重复”是有教育意义的,但这个问题是不同的!) 我的问题是,当我试图检查一些分支是否存在时,perl脚本(我到目前为止已经做过)会创建空分支 我正在使用多维哈希:发现它是我需要处理的信息的最佳方式。 我的意思是散列。。。 所以,我有perl:限制perl在检查时自动创建散列分支,perl,hash,build-automation,Perl,Hash,Build Automation,(关于重复:有针对性的讨论是相关的,但目标不同:作者正在寻找一种方法来找到所有发生此类事件的地方,虽然我知道所有这些地方,但正在寻找一种方法来避免此类行为!因此,尽管读到“重复”是有教育意义的,但这个问题是不同的!) 我的问题是,当我试图检查一些分支是否存在时,perl脚本(我到目前为止已经做过)会创建空分支 我正在使用多维哈希:发现它是我需要处理的信息的最佳方式。 我的意思是散列。。。 所以,我有 $hsh{k1}{k2}{k3}{k4}=v1; $hsh{k1}{k9}{k3}{k33}=v
$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}
DB$h{a}{b}=[1,2]$h{a}{c}=[3,4]#具有两个元素(数组)和两个级别的散列
DB使用数据::转储程序#显示数据的好方法
DB p转储程序\($a,%h)
$VAR1=\undf;
$VAR2={
“a”=>{
‘c’=>[
3.
4.
],
“b”=>[
1.
2.
]
}
};
DB p‘da’if$h{p}{m}#检查存在的键和元素
da
DB p转储程序\($a,%h)
$VAR1=\undf;
$VAR2={
'p'=>{},#[
3.
4.
],
“b”=>[
1.
2.
]
}
};
DB删除$h{p}
再一次:有没有办法避免这种行为而不创建额外的功能?使用CPAN中的模块
use autovivification;
no autovivificaiton; # disable perl's autovivification feature from this point
if ( $hsh{ch1}{ch2}{ch3} ) { ...something... }
请参阅模块谢谢,如果我可以安装任何CPAN,那就太好了:不是我的系统…——我在“Perl大师”论坛上有一些回复,我相信,在这个问题上没有什么需要讨论的了无论如何,谢谢你!