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:
foreach my $v (qw[ a b c ]) {
$v = 'zzz';
}
So now you know the power of the foreach loop.
No comments:
Post a Comment