- my %hash = (
- a => 1,
- b => 2,
- );
- foreach my $v (values %hash) {
- $v = 99;
- }
- warn Data::Dumper->Dump([\%hash], [qw(hash)]);
- # This was the output:
- $hash = {
- a => 99,
- b => 99
- };
This code is trying to edit a hash, and normally, you would iterate over the keys and then change the looked up value somewhat like this:
- foreach my $k (keys %hash) {
- $hash[$k] = 99;
- }
You can also change an items value for an array as well:
- my @test = qw(a b c);
- foreach my $v (@test) {
- $v = 'zzz';
- }
- warn Data::Dumper->Dump([\@test], [qw(test)]);
- # This was the output:
- $test = [
- 'zzz',
- 'zzz',
- 'zzz'
- ];
What is happening here is that the for-loop variable is an alias for each list item. Since its an alias, Perl does not copy the list item's value just to hand $v to you (it's efficient).
The modification of hash values happens in the example because values() itself returns a list of hash values. This below wouldn't work because it introduces an intermediate copy:
- my %hash = (
- a => 1,
- b => 2,
- );
- my @hash_values = values %hash; # make copies of hash value aliases
- foreach my $v (@hash_values) {
- $v = 99;
- }
And the following example is also illegal because we are trying to modify read-only values:
So now you know the power of the foreach loop.
- foreach my $v (qw[ a b c ]) {
- $v = 'zzz';
- }