【问题标题】:perl: restrict perl from automatically creating a hash branches on checkperl:限制 perl 在检查时自动创建哈希分支
【发布时间】: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


    【解决方案1】:

    使用 CPAN 中的 autovivification 模块。

    【讨论】:

    • 谢谢,如果我能安装任何 CPAN 就好了:不是我的系统... --- 我在 'Perl Guru' 论坛 (Perl-Guru-my-post) 上有一些回复,我相信,那里关于这个问题没有什么需要讨论的了。 --- 无论如何,谢谢!
    【解决方案2】:
    use autovivification;
    
    no autovivificaiton; # disable perl's autovivification feature from this point
    
    if ( $hsh{ch1}{ch2}{ch3} ) {  ...something... }
    

    见autovivification模块

    【讨论】:

      猜你喜欢
      • 2013-12-20
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 2013-04-11
      • 2011-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多