Hatena::ブログ(Diary)

ごっ主人ブログ このページをアンテナに追加 RSSフィード

お財布.com - 無料で手軽に貯まる魔法のお財布

2009年10月15日

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

沢山のメールアドレスを、ドメイン毎にソートしたい場合の処理を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

fbisfbis 2009/10/15 16:57 こういう場合はシュワルツ変換を利用するのも一つの手ですね。

print "$_\n" for
map { join('@',@$_) }
sort { $a->[1] cmp $b->[1] || $a->[0] cmp $b->[0] }
map { [split(/@/,$_)] } @maddr_list;

gosshujingosshujin 2009/10/15 17:23 なるほど、無駄が無いですぢゃ。

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/gosshujin/20091015/1255592043