連想配列が入った二つの配列をある値によって突合したい

続・初めてのPerl 改訂第2版

続・初めてのPerl 改訂第2版

連想配列が入った二つの配列がある。
たとえば、ユーザIDと名前のキーと値を持つpersonの配列が一方にあり、
IDとその番号をキーと値に持つuserの配列があったとする。
userにIDがあり、同じIDがpersonのuser_idにもあるかどうかをPerl言語で突合処理したい。どうしたらいいだろう。
39ページにある、4章リファレンス入門にある、Skipperの持ち物チェックのコードを元に考えてみた。

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

my %users1 = (
    id => 1234,
);
my %users2 = (
    id => 5678,
);
my @user_list = ();
push(@user_list, \%users1);
push(@user_list, \%users2);

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

foreach my $person (@person_list) {
    unless ($id_list{$person->{user_id}}) {
        print "$person->{user_id}";
    }
}

これは、暫定的なハッシュid_listを作っている。usersのidをキーにした、値が1のハッシュである。
この暫定的なハッシュid_listを使って、personのuser_idがこのid_listにキーを持つかどうか判定することが、
結果的にusersとpersonsのidの突合をしていることになる。すこしややこしいけれど。