Perl Best Practices [Electronic resources]

Damian Conway

نسخه متنی -صفحه : 317/ 129
نمايش فراداده

8.10. Hash Values

Make appropriate use of lvalue values .

Another builtin that can sometimes be used in an lvalue manner is the values function for hashes, though only in Perl 5.005_04 and later. Specifically, in recent Perls the values function returns a list of the

original values of the hash, not a list of copies (as it did in Perl 5.005_03 and earlier).

This list of lvalues cannot be used in direct assignments:

values(%seen_files) = (  );    # Compile-time error

but it

can be used indirectly: in a for loop. That is, if you need to transform every value of a hash in some generic fashion, you don't have to index repeatedly within a loop:

for my $party (keys %candidate_for) {
$candidate_for{$party} =~ s{($MATCH_ANY_NAME)}
{\U$1}gmxs;
}

You can just use the result of values as individual lvalues:

for my $candidate (values %candidate_for) { $candidate =~ s{($MATCH_ANY_NAME)} {\U$1}gxms; }

The performance of the values-based version is also better. The loop's iterator variable is directly aliased to each hash value, so there's no need for (expensive) hash loop-ups inside the loop.

Stick with the indexing approach, however, if your code also has to support pre-5.6 compilers.