On Wed, Jul 7, 2010 at 06:57, Srinivasa Chaitanya T
<tschaitanya....@gmail.com> wrote:
> Thanks that solves the my question. Also I want a write function similar to
> "map" for hash.
> I can use map itself for that, but I have to refer the hash variable name in
> code block.
> How I write without referring the variable?
>
> my %as;
> my %bs;
>
> $as {'one'} = 1;
> $as {'two'} = 2;
> $as {'three'} = 3;
> $as {'four'} = 4;
> %bs = map {$_ => ($as{$_} + 10)} keys %as;
snip

You could write a function (see below) that looked like this:

my %bs = hash_map sub { shift() => shift() + 10 }, %as;

But if all you want to do is modify the values of a hash, just say

$_ += 10 for values %as;

If you do not want to not modify %as, then say

my %bs = %as;
$_ += 10 for values %bs;

But be forewarned, that only creates a shallow copy of %as.  If %as is
a nested data structure, you will need to use some form of deep
copying function like the [Storable][1] module's dclone to get a copy
that will not interact with %as.

#!/usr/bin/perl

use strict;
use warnings;

sub hash_map {
        my ($func, %hash) = @_;

        my %ret;
        while (my ($k, $v) = each %hash) {
                my %subhash = $func->($k, $v);
                while (my ($k, $v) = each %subhash) {
                        $ret{$k} = $v;
                }
        }
        return %ret;
}

my %as = (a => 1, b => 2, c => 3);
my %bs = hash_map sub { $_[0] => $_[1] + 10 }, %as;

use Data::Dumper;

print Dumper \%as, \%bs;

 [1]: http://perldoc.perl.org/Storable.html

-- 
Chas. Owens
wonkden.net
The most important skill a programmer can have is the ability to read.

-- 
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/


Reply via email to