【问题标题】:Deleting Key from 2D Hash in Perl在 Perl 中从 2D 哈希中删除密钥
【发布时间】:2013-04-19 22:23:19
【问题描述】:

我的哈希是这样的

%hIDSet = (
      'TSASD2' => {
                    'country' => 'US',
                    'newid' => 'IMRAN',
                    'oldid' => 'TSASD4'
                  }

      'TS767' => {
                   'country' => 'DE',
                   'newid' => 'B90LKT',
                   'oldid' => '432553'
                 },
    );

当我这样做时

my $sID = "TSASD2";
delete $hIDSet{$sID};

我得到的输出是

%hIDSet = (
  'TSASD2' => {},
  'TS767' => {
               'country' => 'DE',
               'newid' => 'B90LKT',
               'oldid' => '432553'
             },
);

我的问题是为什么没有完全删除 ID?

【问题讨论】:

  • 确实删除了。您一定是再次尝试访问密钥,所以密钥被激活了。
  • 显然您应该向我们展示更多代码。在复制和粘贴过程中发生了很多变化。
  • 是的。我在代码的后面部分重新创建它。虽然是无意的。谢谢!

标签: perl hash key 2d


【解决方案1】:

您确实删除了密钥,因此您必须在再次转储哈希之前重新创建它,如下面的 sn-p:

my $sID = "TSASD2";
my %hIDSet = ( $sID => {} );
delete $hIDSet{$sID};
print(Dumper(\%hIDSet));  # It's gone
if ($hIDSet{$sID}{foo}) { '...' }
print(Dumper(\%hIDSet));  # You've recreated it.

请记住

$hIDSet{$sID}{foo}

简称

$hIDSet{$sID}->{foo}

还有那个

EXPR->{foo}

意思

( EXPR //= {} )->{foo}

所以

$hIDSet{$sID}{foo}

意思

( $hIDSet{$sID} //= {} )->{foo}

请注意,这可以分配给$hIDSet{$sID}

【讨论】:

  • 这是最有帮助的评论之一。是的,你是对的,我在代码的后面部分重新创建它。我修好了。现在看起来不错!!谢谢!!!
【解决方案2】:

无法复制。

您混淆了 Perl 哈希和 hashref 文字的语法。这表示一个 hashref:

use Data::Dumper;
my $hashref = {
  foo => 'bar', # ← note comma between items
  baz => 'qux',
};
delete $hashref->{foo};
print Dumper $hashref;
# $VAR1 = { baz => "qux" };

另一方面,哈希只是列表:

use Data::Dumper;
my %hash = ( # note parens
  foo => 'bar',
  baz => 'qux',
);
delete $hash{foo};
print Dumper \%hash;
# $VAR1 = { baz => "qux" };

由于缺少逗号,您提供的代码不应编译,并且由于 hash-hashref 不匹配而无法使用 use strict; use warnings; 运行。清理类型,它应该可以正常工作。

【讨论】:

  • 感谢您的信息!我修好了它。我正在重新创建密钥。
猜你喜欢
  • 1970-01-01
  • 2012-11-09
  • 1970-01-01
  • 2013-08-31
  • 2015-12-18
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多