use 5.036; use strict; # not needed but left out of habit use warnings; use List::Util qw /pairs pairvalues pairmap/; use Benchmark qw /cmpthese/; use experimental qw/for_list declared_refs/; my @vals = (1..100000); my %val_hash = @vals; say lu_pairs(); say lu_pairs_refalias(); say lu_pairvals(); say lu_pairvals_hash(); say for_list_a(); say for_list_h(); say while_each(); say hash_vals(); say hash_by_key(); say h_pairmap(); # updated from original post - was say a_pairmap() say a_pairmap(); cmpthese(-3, { a_pairs => \&lu_pairs, a_pairs_alias => \&lu_pairs_refalias, a_pair_vals => \&lu_pairvals, h_pair_vals => \&lu_pairvals_hash, a_for_list => \&for_list_a, h_for_list => \&for_list_h, h_each => \&while_each, h_vals => \&hash_vals, h_by_key => \&hash_by_key, a_pairmap => \&a_pairmap, h_pairmap => \&h_pairmap, }); sub lu_pairs { my $i; for my $pair (pairs @vals) { $i += $pair->[1]; } return $i; } sub lu_pairs_refalias { my $i; for my \@pair (pairs @vals) { $i += $pair[1]; } return $i; } sub lu_pairvals { my $i; for my $val (pairvalues @vals) { $i += $val; } return $i; } sub lu_pairvals_hash { my $i; for my $val (pairvalues %val_hash) { $i += $val; } return $i; } sub for_list_a { my $i; for my ($key, $value) (@vals) { $i += $value; } return $i; } sub for_list_h { my $i; for my ($key, $value) (%val_hash) { $i += $value; } return $i; } sub while_each { my $i; while (my ($key, $value) = each %val_hash) { $i += $value; } return $i; } sub hash_vals { my $i; foreach my $value (values %val_hash) { $i += $value; } return $i; } sub hash_by_key { my $i; foreach my $key (keys %val_hash) { $i += $val_hash{$key}; } return $i; } sub a_pairmap { my $i; pairmap { $i += $b } @vals; return $i; } sub h_pairmap { my $i; pairmap { $i += $b } %val_hash; return $i; }