use 5.036; use strict; use warnings; use List::Util qw /pairs pairvalues/; 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 for_list_a(); say for_list_h(); say while_each(); say hash_vals(); say hash_by_key(); cmpthese(-3, { a_pairs => \&lu_pairs, a_pairs_alias => \&lu_pairs_refalias, a_pair_vals => \&lu_pairvals, 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, }); 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 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; }