Perl楽しいから好き

Perlをはじめとしたプログラミング周りのあれこれについて。モダーンなPerlを楽しんでいます。

Perlで2つの配列を比較し、重複する要素の数をカウントする処理を書いてみた

「6月に来店したお客様のうち、7月に何名の方がリピートしてくださったか?」といった数字を拾いたい事象が発生。6月の来店済み顧客IDの配列と7月の来店済み顧客IDの配列を比較して重複分を拾えばいいじゃない!ということで、書きました。foreachを2重にするのは、「なんか違う」と思って調べたら、こんな感じに仕上がりました。

#!/usr/bin/env perl
use strict;
use warnings;
use Test::More tests => 1;

# 2つの配列のうち重複する要素の数を取得
# @param array_ref $array_a_ref 比較したい配列1
# @param array_ref $array_b_ref 比較したい配列2
# @return int $result_count 重複する要素数
sub get_duplicate_count {
    my ($array_a_ref, $array_b_ref) = @_;
    my %count;
    my @result;
    # 2つの配列の要素を、要素をキーにしたハッシュに格納
    $count{$_}++ for (@$array_a_ref, @$array_b_ref);
    # 要素数が2以上のもの(重複するやつ)のみ抽出
    @result = grep {$count{$_} >= 2} keys %count;
    my $result_count = @result;
    return $result_count;
}

my @arr_a = qw(1 2 3 4 5 6 7 8 9 10);
my @arr_b = qw(2 4 6 8 10);

is(get_duplicate_count(\@arr_a, \@arr_b), 5, 'test count duplicate');

先日、Javaを書いてて「配列の要素の重複を消したい」ってなりました。で、Listで作ったコレクションをSetインターフェースに変換するだけで重複が消えたときは、「魔法かよ」って思った。プログラミング言語によって色々とやり方のバリエーションがあるんだなぁ、と実感。

静的型付け言語と関数型言語を、掘り下げてみたいという欲求が上がった。