Quy tắc ngón tay cái là sử dụng chức năng phù hợp nhất với nhu cầu của bạn.
Nếu bạn chỉ muốn các khóa và không có kế hoạch đọc bất kỳ giá trị nào, hãy sử dụng các khóa ():
foreach my $key (keys %hash) { ... }
Nếu bạn chỉ muốn các giá trị, hãy sử dụng giá trị ():
foreach my $val (values %hash) { ... }
Nếu bạn cần các khóa và giá trị, hãy sử dụng từng ():
keys %hash; # reset the internal iterator so a prior each() doesn't affect the loop
while(my($k, $v) = each %hash) { ... }
Nếu bạn định thay đổi các khóa của hàm băm theo bất kỳ cách nào ngoại trừ việc xóa khóa hiện tại trong quá trình lặp, thì bạn không được sử dụng từng (). Ví dụ: mã này để tạo một bộ khóa chữ hoa mới với các giá trị nhân đôi hoạt động tốt bằng cách sử dụng các phím ():
%h = (a => 1, b => 2);
foreach my $k (keys %h)
{
$h{uc $k} = $h{$k} * 2;
}
tạo ra kết quả băm mong đợi:
(a => 1, A => 2, b => 2, B => 4)
Nhưng sử dụng mỗi () để làm điều tương tự:
%h = (a => 1, b => 2);
keys %h;
while(my($k, $v) = each %h)
{
$h{uc $k} = $h{$k} * 2; # BAD IDEA!
}
tạo ra kết quả không chính xác theo những cách khó dự đoán. Ví dụ:
(a => 1, A => 2, b => 2, B => 8)
Tuy nhiên, điều này là an toàn:
keys %h;
while(my($k, $v) = each %h)
{
if(...)
{
delete $h{$k}; # This is safe
}
}
Tất cả những điều này được mô tả trong tài liệu perl:
% perldoc -f keys
% perldoc -f each