【问题标题】:perl: can a hash entry reference be used to delete from the hash?perl:可以使用哈希条目引用从哈希中删除吗?
【发布时间】:2014-07-08 07:33:27
【问题描述】:

这是我要问的一些 perl 伪代码:

my %x;
# initialize %x

my $ref = whateverSyntacticSugarIsNeeded( $x{this}{hash}{is}{deep} );

# ...
# make use of $ref multiple times
# ...

delete $ref; # ideally, this would delete $x{this}{hash}{is}{deep}

...这里的想法是避免使用超过绝对必要的$x{this}{hash}{is}{deep}

我很确定这是不可能的,最少使用次数是 2(值的初始引用/副本,然后从 %x 中删除键/值对)。但是,如果我弄错了,请随时纠正我。

【问题讨论】:

    标签: perl hash filehandle


    【解决方案1】:

    不清楚你到底想要什么。如果

    %x = ( very => { deep => { hash => { is => "here" } } } );
    

    然后你分配

    $y = $x{very}{deep}{hash}{is}
    

    那就是写作

    $y = 'here'
    

    所以你不能delete $y。不过,您可以,

    $z = $x{very}{deep}{hash};
    delete $z->{is};
    

    【讨论】:

      【解决方案2】:

      最简单的事情就是向上一级引用哈希。

      如果你给变量一个语义上合适的名字(ref 以外的名字),尤其如此:

      my %x;
      # initialize %x
      
      my $ref = $x{this}{hash}{is};
      
      # ...
      # make use of $ref multiple times
      # ...
      
      delete $ref->{deep}; 
      

      【讨论】:

        【解决方案3】:

        Perl 通过对那块内存的计数来跟踪一块内存是否被使用。如果我这样做:

        my $ref->{this}->{is}->{a}->{deep} = "hash";
        undef $ref;     # Note I use "undef" and not "delete"
        

        我释放了所有的内存。所有哈希引用和这些哈希引用指向的实际标量。那是因为我没有其他方法可以访问该内存。

        如果我做一些更简单的事情:

        my %hash = ( one => 1, two => 2, ref => { three => 3, four => 4 }, five => 5 );
        

        请注意,$hash{ref} 是对另一个哈希的引用。如果我这样做:

        my $ref = $hash{ref};
        

        我现在有两个变量可以访问那块内存。这样做:

        delete $hash{ref};
        

        不会释放该内存,因为$ref 仍然指向它。但是,该哈希引用不再在我的 %hash 哈希中。

        如果我没有删除$hash{ref},而是这样做了:

        $ref->{seven} = 7;
        

        我更改了%hash,因为$ref$hash{ref} 指向同一块内存:相同的哈希引用。这样做:

        delete $hash{ref}->{four};
        

        或 删除 $ref->{four};

        都将删除该哈希引用中的特定条目。

        我们也不必做那么复杂的事情:

        my %hash = ( one => 1, two => 2, three => 3 );
        my $ref = \%hash;     #Creating a reference to that hash
        delete $ref->{three};
        

        这将删除 $hash{three} 因为两者都指向内存中的相同哈希。然而,

        undef $ref;
        

        也不会取消定义$hash

        我希望这涵盖了您的问题。只要有另一种方式来引用内存位置,它就不会在 Perl 中被释放。但是,如果您指向一个数据结构的引用,则通过引用操作该数据结构将操作通过数组或哈希变量引用的该数据结构。

        【讨论】:

          猜你喜欢
          • 2021-06-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-08
          • 2014-04-13
          • 1970-01-01
          • 1970-01-01
          • 2019-09-04
          相关资源
          最近更新 更多