Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
perl:限制perl在检查时自动创建散列分支_Perl_Hash_Build Automation - Fatal编程技术网

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

(关于重复:有针对性的讨论是相关的,但目标不同:作者正在寻找一种方法来找到所有发生此类事件的地方,虽然我知道所有这些地方,但正在寻找一种方法来避免此类行为!因此,尽管读到“重复”是有教育意义的,但这个问题是不同的!)

我的问题是,当我试图检查一些分支是否存在时,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}
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大师”论坛上有一些回复,我相信,在这个问题上没有什么需要讨论的了无论如何,谢谢你!