2008年 03月 12日

Perl のリスト、ハッシュのマージ、reduce メモ

Ruby での

require "pp"

data = [
	{ :name => "foo", :value => 1 },
	{ :name => "bar", :value => 2 },
	{ :name => "baz", :value => 3 },
]


pp data.inject(0) {|r,i| r + i[:value] }

pp data.inject({}) {|r,i| r.update( i[:name] => i ) }

__END__
6
{"baz"=>{:value=>3, :name=>"baz"},
 "foo"=>{:value=>1, :name=>"foo"},
 "bar"=>{:value=>2, :name=>"bar"}}
use List::Util qw/reduce/;

use Data::Dumper;
sub p ($) { print Dumper shift }

my $data = [
	{ name => "foo", value => 1 },
	{ name => "bar", value => 2 },
	{ name => "baz", value => 3 },
];

p reduce { $a + $b->{value} } 0, @$data;

p reduce { +{ %$a, $b->{name} => $b } } {}, @$data;

__END__
$VAR1 = 6;
$VAR1 = {
          'bar' => {
                     'value' => 2,
                     'name' => 'bar'
                   },
          'baz' => {
                     'value' => 3,
                     'name' => 'baz'
                   },
          'foo' => {
                     'value' => 1,
                     'name' => 'foo'
                   }
        };

引数のとりかた的に Perl は初期値の与えかたが自然な感じがする。