2010-03-03 3 views
5

어떻게 배열의 다음 해시에서 요소를 삭제할 수 있습니까? 내가 flintstones에서 예컨대 {day=>'21'}을 삭제하고 결과처럼 보이게 할 수있는 방법처럼Perl에서 배열의 해시 : 순회 및 삭제

%HoA = (
    flintstones => [ {day=>'19'}, {day=>'21'}, {day=>'22'} ], 
    jetsons  => [ {day=>'29'}, {day=>'23'}, {day=>'25'} ], 
    simpsons  => [ {day=>'26'}, {day=>'33'}, {day=>'27'} ] 
); 

;

%HoA = (
    flintstones => [ {day=>'19'}, {day=>'22'} ], 
    jetsons  => [ {day=>'29'}, {day=>'23'}, {day=>'25'} ], 
    simpsons  => [ {day=>'26'}, {day=>'33'}, {day=>'27'} ] 
); 

해시 =(); 하지만 내가 배열의 각 grepkeys %HoA 이상

답변

2

으로 반복 삭제 적용되는 요소 대신에 undef, 결과 다시 $HoA{$key}에, 결과에 가게 참조를 (당신은 @{$HoA{$key}} 그들을 unreference해야합니다).

0

해시에서 특정 요소를 삭제하려면 delete 함수를 사용하십시오.

삭제 $ HoA {flintstones} -> [1]; 당신이 플린트 스톤의 배열에서 [1] 요소를 제거 할 것인지 알고 있다면

+0

"배열 참조가 아닙니다" – bilal

10

, 직접 splice를 사용할 수 있습니다

splice @{$HoA{flintstones}}, 1, 1; 

당신은 단순히 당신이 요소 = 21 일을 가진 제거 할 것인지 알고 있다면, grep를 사용 하나 이러한 방법 :

$HoA{flintstones} = [ grep { $_->{day} != 21 } @{$HoA{flintstones}} ]; 

또는이 더 나은 방법으로

, 숀의 대답에 의해 제안 :

,132
4

이 (10)는 (있는 경우) 모든 %HoA의 배열을 참조 할 것 $HoA{flintstones}$HoA{flintstones}에 기존 참조를 신선한 arrayref를 할당 이상의 장점이 있습니다.

또는 더 판독 가능 :

my $flintstones = $HoA{flintstones}; 
@$flintstones = grep { $$_{day} != 21 } @$flintstones; 
0

$를 삭제 {$ {$ HoA를 {플린트 스톤}} [1]} {일};

관련 문제