หลักการทั่วไปคือการใช้ฟังก์ชันที่เหมาะสมกับความต้องการของคุณมากที่สุด
หากคุณต้องการเพียงแค่คีย์และไม่ได้วางแผนที่จะอ่านค่าใด ๆ ให้ใช้คีย์ ():
foreach my $key (keys %hash) { ... }
หากคุณต้องการเพียงแค่ค่าให้ใช้ค่า ():
foreach my $val (values %hash) { ... }
หากคุณต้องการคีย์และค่าให้ใช้แต่ละ ():
keys %hash; # reset the internal iterator so a prior each() doesn't affect the loop
while(my($k, $v) = each %hash) { ... }
หากคุณวางแผนที่จะเปลี่ยนคีย์ของแฮชด้วยวิธีใดก็ตามยกเว้นการลบคีย์ปัจจุบันในระหว่างการทำซ้ำคุณจะต้องไม่ใช้แต่ละคีย์ () ตัวอย่างเช่นรหัสนี้เพื่อสร้างชุดคีย์ตัวพิมพ์ใหญ่ใหม่ที่มีค่าสองเท่าทำงานได้ดีโดยใช้คีย์ ():
%h = (a => 1, b => 2);
foreach my $k (keys %h)
{
$h{uc $k} = $h{$k} * 2;
}
การผลิตแฮชผลลัพธ์ที่คาดหวัง:
(a => 1, A => 2, b => 2, B => 4)
แต่ใช้แต่ละ () เพื่อทำสิ่งเดียวกัน:
%h = (a => 1, b => 2);
keys %h;
while(my($k, $v) = each %h)
{
$h{uc $k} = $h{$k} * 2; # BAD IDEA!
}
ให้ผลลัพธ์ที่ไม่ถูกต้องในรูปแบบที่คาดเดาได้ยาก ตัวอย่างเช่น:
(a => 1, A => 2, b => 2, B => 8)
อย่างไรก็ตามสิ่งนี้ปลอดภัย:
keys %h;
while(my($k, $v) = each %h)
{
if(...)
{
delete $h{$k}; # This is safe
}
}
ทั้งหมดนี้มีอธิบายไว้ในเอกสาร perl:
% perldoc -f keys
% perldoc -f each