2013-04-25 34 views
2
從2D哈希刪除鍵

我的哈希看起來像這樣在Perl

%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沒有完全刪除?

+1

它確實刪除了。你一定曾試圖再次訪問密鑰,所以密鑰是生動的。 – imran 2013-04-25 21:08:12

+0

顯然你應該向我們展示更多的代碼。複製和粘貼過程中發生了很多變化。 – imran 2013-04-25 21:20:54

+0

是的。我在代碼的後面部分重新創建它。雖然這是無意的。謝謝! – 2013-04-25 21:51:30

回答

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}

+0

這是最有用的評論之一。是的你是對的,我在代碼的後面部分重新創建它。我修正了這一點。現在看起來不錯!謝謝!!! – 2013-04-25 21:49:53

3

無法重現。

你在混淆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" }; 

您提供的代碼不應該編譯,因爲缺少逗號,而將無法與use strict; use warnings;運行由於散列hashref不匹配。清理類型,它應該工作正常。

+0

感謝您的信息!我修好了它。我正在重新創建密鑰。 – 2013-04-25 21:50:37