雑記

my @data = (
  {prefecture=>'osaka',name=>'fn7'},
  {prefecture=>'hyogo',name=>'fn6'},
  {prefecture=>'kyoto',name=>'fn5'},
  {prefecture=>'hyogo',name=>'fn4'},
  {prefecture=>'nara',name=>'fn3'},
  {prefecture=>'osaka',name=>'fn2'},
  {prefecture=>'kyoto',name=>'fn1'},
  {prefecture=>'shiga',name=>'fn0'},
);

というデータがあったとして、prefectureをキーにしてハッシュにする方法を
今迄とは違う方法にしようと自分の中で決めたw

今迄は

my %list_by_pref;
foreach(@data){
  unless(defined $list_by_pref{$_->{prefecture}}){
    $list_by_pref{$_->{prefecture}} = [$_];
  }else{
    push @{$list_by_pref{$_->{prefecture}}},$_;
  }
}

これからは

my %list_by_pref;
foreach(@data){
  my $list = $list_by_pref{$_->{prefecture}} || [];
  push @$list,$_;
  $list_by_pref{$_->{prefecture}} = $list;
}

どちらも以下のようなデータが作成される。

$VAR1 = {
          'hyogo' => [
                       {
                         'name' => 'fn6',
                         'prefecture' => 'hyogo'
                       },
                       {
                         'name' => 'fn4',
                         'prefecture' => 'hyogo'
                       }
                     ],
          'osaka' => [
                       {
                         'name' => 'fn7',
                         'prefecture' => 'osaka'
                       },
                       {
                         'name' => 'fn2',
                         'prefecture' => 'osaka'
                       }
                     ],
          'nara' => [
                      {
                        'name' => 'fn3',
                        'prefecture' => 'nara'
                      }
                    ],
          'kyoto' => [
                       {
                         'name' => 'fn5',
                         'prefecture' => 'kyoto'
                       },
                       {
                         'name' => 'fn1',
                         'prefecture' => 'kyoto'
                       }
                     ],
          'shiga' => [
                       {
                         'name' => 'fn0',
                         'prefecture' => 'shiga'
                       }
                     ]
        };