Masteries

技術的なことや仕事に関することを書いていきます.

小ネタ: Perlで条件に応じて配列の中身を割り振る時はList::MoreUtils#partが使える

メモです. こういう配列があったとします:

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 を使うのがよさそうです.

metacpan.org

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