二つのハッシュの配列を突合して一致したものを順番の前半に持ってきたい

さきほど、「連想配列が入った二つの配列をある値によって突合したい」の作業で、
仮にusersとpersonsと呼んでいる二つのデータ構造を突合することができるようになった。


ここから、両方に存在するデータを順序的に前にもってきて、そうでないものを後に置くような処理を行う。

my %person1 = (
    user_id   => 1234,
    name      => 'test'
);
my %person2 = (
    user_id   => 5678,
    name      => 'hoge'
);
my %person3 = (
    user_id   => 9101,
    name      => 'fuga'
);
my %person4 = (
    user_id => 2345,
    name    => 'aaaa'
);
my @person_list = ();
push(@person_list, \%person1);
push(@person_list, \%person2);
push(@person_list, \%person3);
push(@person_list, \%person4);

my %users1 = (
    id => 2345,
);
my %users2 = (
    id => 9101,
);
my @user_list = ();
push(@user_list, \%users1);
push(@user_list, \%users2);

my %id_list = map {$_->{id}, 1} @user_list;

my @found_list = ();
my @not_found_list = ();

foreach my $person (@person_list) {
    if ($id_list{$person->{user_id}}) {
        @found_list = (@found_list, $person);
    } else {
        @not_found_list = (@not_found_list, $person);
    }
}

@person_list = [\@found_list, \@not_found_list];

use Data::Dumper;
print Dumper @person_list;

foreach以下が新しいロジックである。両方でidが一致するかどうかの判定を%id_listを一時的に作って行うところまでは前回の通りである。
突合を行って、一致と不一致を別々の配列に積んでいく。
最後に@person_listをidが一致したものの配列を前、一致しなかったものの配列を後ろにした配列のリファレンスで上書く。
これでOKのようだ。


リファレンスはややこしい。