メールアドレスをドメイン毎に分けてソート

沢山のメールアドレスを、ドメイン毎にソートしたい場合の処理をPerlで書いてみた。

#!/usr/bin/perl -w
use strict;
use warnings;

my @maddr_list = (
    'bbb@ezweb.ne.jp',
    'aaa@yahoo.co.jp',
    'bbb@yahoo.co.jp',
    'ccc@gmail.com',
    'bbb@softbank.ne.jp',
    'ccc@yahoo.co.jp',
    'aaa@docomo.ne.jp',
    'aaa@softbank.ne.jp',
    'ccc@docomo.ne.jp',
    'bbb@gmail.com',
    'ccc@softbank.ne.jp',
    'bbb@docomo.ne.jp',
    'ccc@ezweb.ne.jp',
    'aaa@ezweb.ne.jp',
    'aaa@gmail.com',
);

my %hash = ();

for my $address (@maddr_list) {
    my ($user, $domain) = $address =~ m!^(.+)@([^@]+)$!;
    if (!exists($hash{$domain})) { $hash{$domain} = []; }
    push(@{$hash{$domain}}, $address);
}

for my $domain (sort(keys(%hash))) {
    for my $address (sort(@{$hash{$domain}})) {
        printf("%s\n", $address);
    }
}

結果。

aaa@docomo.ne.jp
bbb@docomo.ne.jp
ccc@docomo.ne.jp
aaa@ezweb.ne.jp
bbb@ezweb.ne.jp
ccc@ezweb.ne.jp
aaa@gmail.com
bbb@gmail.com
ccc@gmail.com
aaa@softbank.ne.jp
bbb@softbank.ne.jp
ccc@softbank.ne.jp
aaa@yahoo.co.jp
bbb@yahoo.co.jp
ccc@yahoo.co.jp