メモです. こういう配列があったとします:
my @array = ( { type => 'foo', value => 1 }, { type => 'bar', value => 2 }, { type => 'foo', value => 3 }, );
この時, type
によって@array
の中身をそれぞれ別の配列に割り振りたい, と思う時があります.
# こうしたい my @foo = ( { type => 'foo', value => 1 }, { type => 'foo', value => 3 }, ); my @bar = ( { type => 'bar', value => 2 }, );
こういうときは, タイトルにある通りで, List::MoreUtils#part を使うのがよさそうです.
use DDP; use List::MoreUtils qw(part); my @array = ( { type => 'foo', value => 1 }, { type => 'bar', value => 2 }, { type => 'foo', value => 3 }, ); my ($foo, $bar) = part { $_->{type} eq 'foo' ? 0 : 1 } @array; p $foo; # \ [ # [0] { # type "foo", # value 1 # }, # [1] { # type "foo", # value 3 # } # ] p $bar; # \ [ # [0] { # type "bar", # value 2 # } # ]
当てはまる要素がない場合は, 空配列ではなくundef
になるのでその点は注意しましょう.
use DDP; use List::MoreUtils qw(part); my @array = ( { type => 'foo', value => 1 }, ); my ($foo, $bar) = part { $_->{type} eq 'foo' ? 0 : 1 } @array; p $foo; # \ [ # [0] { # type "foo", # value 1 # } # ] p $bar; # undef