each
có biến buit-in, ẩn toàn cầu có thể làm tổn thương bạn. Trừ khi bạn cần hành vi này, an toàn hơn khi chỉ sử dụng keys
.
Hãy xem xét ví dụ này, nơi chúng tôi muốn nhóm cặp k/v chúng tôi (vâng, tôi biết printf
sẽ làm điều này tốt hơn):
#!perl
use strict;
use warnings;
use Test::More 'no_plan';
{ my %foo = map { ($_) x 2 } (1..15);
is(one(\%foo), one(\%foo), 'Calling one twice works with 15 keys');
is(two(\%foo), two(\%foo), 'Calling two twice works with 15 keys');
}
{ my %foo = map { ($_) x 2 } (1..105);
is(one(\%foo), one(\%foo), 'Calling one twice works with 105 keys');
is(two(\%foo), two(\%foo), 'Calling two twice works with 105 keys');
}
sub one {
my $foo = shift;
my $r = '';
for(1..9) {
last unless my ($k, $v) = each %$foo;
$r .= " $_: $k -> $v\n";
}
for(10..99) {
last unless my ($k, $v) = each %$foo;
$r .= " $_: $k -> $v\n";
}
return $r;
}
sub two {
my $foo = shift;
my $r = '';
my @k = keys %$foo;
for(1..9) {
last unless @k;
my $k = shift @k;
$r .= " $_: $k -> $foo->{$k}\n";
}
for(10..99) {
last unless @k;
my $k = shift @k;
$r .= " $_: $k -> $foo->{$k}\n";
}
return $r;
}
Gỡ rối các lỗi trình bày trong các bài kiểm tra trên trong một ứng dụng thực tế sẽ đau đớn khủng khiếp. (Đối với tốt hơn sử dụng đầu ra Test::Differences
eq_or_diff
thay vì is
.)
Tất nhiên one()
thể được cố định bằng cách sử dụng keys
để xóa các iterator lúc bắt đầu và kết thúc của chương trình con. Nếu bạn nhớ. Nếu tất cả đồng nghiệp của bạn nhớ. Nó hoàn toàn an toàn miễn là không ai quên.
Tôi không biết về bạn, nhưng tôi sẽ chỉ sử dụng keys
và values
.
Tôi sẽ hình dung rằng các cách giải quyết thông thường bao gồm việc đánh giá 'các phím HASH' hoặc' các giá trị HASH' –