2006-01-27(Fri)と似た話題ですが、今度は、メーラの人気度の統計を取ってみたくなりました。
~/Mail以下に、さらにディレクトリがあってメールが分類されているので、各ディレクトリをたどって、集計していく必要があります。「初めてのPerl」のp207を見ると、File::Findモジュールを利用すると再帰的なディレクトリ処理ができるとのことなので、早速、使ってみました。
mailer_check関数内のメーラごとの条件分岐が、もう少しうまく書けないかなぁと思います。
集計してみて、分かったことは
- Outlook が圧倒的に多い
ことです。ちなみに僕は、Mewを学生時代から愛用しています。
#!/usr/bin/perl use strict; use warnings; use File::Find; my $debug = 0; my $Mailpath = '~/Mail'; my %mailer; sub main { find(\&mailer_check, $Mailpath); &display_by_count; } sub mailer_check { my $file = $_; # backupは送信メールのため処理の対象外 unless ($File::Find::name =~ /backup/) { print "$File::Find::name\n" if $debug; if (-f $file and $file =~ /^\d+$/) { print "$file: \n" if $debug; open MAIL, $file or die "$!"; while (my $line = <MAIL>){ if ($line =~ /^X-Mailer:\s*(.*)$/ or $line =~ /^User-Agent:\s*(.*)$/) { my $mailer = $1; print "$file: $mailer\n" if $debug; if ($mailer =~ /Mew/) { $mailer{"Mew"}++; } elsif ($mailer =~ /Outlook/) { $mailer{"Outlook"}++; } elsif ($mailer =~ /Thunderbird/){ $mailer{"Thunderbird"}++; } elsif ($mailer =~ /AL-Mail/) { $mailer{"AL-Mail"}++; } elsif ($mailer =~ /Sylpheed/){ $mailer{"sylpheed"}++; } elsif ($mailer =~ /Becky/) { $mailer{"Becky!"}++; } elsif ($mailer =~ /Denshin/){ $mailer{"Denshin8Go"}++; } else { $mailer{"$mailer"}++; } } } } } } sub display_by_count { foreach (sort by_count keys %mailer){ print "$_ : $mailer{$_}\n"; } } sub by_count { $mailer{$b} <=> $mailer{$a}; } main; 1;