2

私のハッシュは次のようになります

%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 が完全に削除されないのはなぜですか?

4

2 に答える 2

4

キーを削除したため、次のスニペットのように、ハッシュを再度ダンプする前にキーを再作成する必要があります。

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}

于 2013-04-25T21:30:49.077 に答える
3

再現できません。

Perl ハッシュと 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" };

提供されたコードは、カンマがないためにコンパイルされるべきではなくuse strict; use warnings;、ハッシュとハッシュリファレンスの不一致のために実行に失敗します。タイプをクリーンアップすると、問題なく動作するはずです。

于 2013-04-25T21:10:24.310 に答える