2010-03-03 38 views
5

làm thế nào tôi có thể xóa một phần tử khỏi mảng băm sau đây;Hashes of Array trong Perl: traversal và xóa

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

Giống như làm thế nào tôi có thể xóa ví dụ {day=>'21'} từ flintstones và làm cho kết quả tìm kiếm tương tự;

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

Tôi đã thử sử dụng hàm Hash =(); nhưng có kết quả trong undef, ở vị trí của phần tử mà tôi xóa

Trả lời

2

lặp trên keys %HoA, áp dụng grep trên mỗi mảng (bạn sẽ phải unreference chúng với @{$HoA{$key}}), lưu trữ tài liệu tham khảo các kết quả trở lại trong $HoA{$key}.

0

Sử dụng chức năng xóa để xóa phần tử cụ thể khỏi băm.

xóa $ HoA {flintstones} -> [1];

+0

nó cung cấp "KHÔNG tham chiếu Mảng" – bilal

10

Nếu bạn biết rằng bạn muốn loại bỏ các yếu tố [1] từ mảng Flintstones, bạn có thể sử dụng splice trực tiếp:

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

Nếu bạn chỉ biết rằng bạn muốn loại bỏ các yếu tố có ngày = 21, sử dụng grep hoặc theo cách này:

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

Hoặc theo cách tốt hơn này, theo đề nghị của Sean câu trả lời:

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

này có lợi thế hơn chỉ gán một arrayref tươi để $HoA{flintstones} rằng tài liệu tham khảo hiện có để $HoA{flintstones} (nếu có) tất cả sẽ tiếp tục đề cập đến mảng trong %HoA.

Hoặc, readably hơn:

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

xóa $ {$ {$ HOA {Flintstones}} [1]} {ngày};

Các vấn đề liên quan