my @order; for my $key (keys %HoA) { if ($key eq 'Foo') { unshift @order, $key; } else { push @order, $key; } } for my $key (@order) { ... } #### my @order; for my $key (keys %HoA) { ($key eq 'Foo') ? unshift(@order, $key) : push(@order, $key); } #### my @order; for my $key (keys %HoA) { splice(@order, ($key eq 'Foo') ? 0 : @order, (), $key); } #### my %early = my %late = %HoA; # or map { $_ => 1 } keys %HoA delete $late{Foo}; delete @early{keys %late}; for my $key (keys %early, keys %late) { ... }