#!/usr/bin/perl use strict; use warnings; use File::Find; use Benchmark qw/ cmpthese /; my %ad; my @dirs = glob( $ENV{HOME} . '/Maildir/.misc.d*' ); cmpthese( 100, { Old => sub { %ad = (); find( \&old, @dirs ); }, Case_Ins => sub { %ad = (); find( \&case_insensitive, @dirs ) }, '1_Read' => sub { %ad = (); find( \&one_read, @dirs ) }, '1_Match' => sub { %ad = (); find( \&one_match, @dirs ) }, '1_Read_1_Match' => sub { %ad = (); find( \&one_read_one_match, @dirs ) }, No_XMS => sub { %ad = (); find( \&no_xms, @dirs ) }, No_X => sub { %ad = (); find( \&no_x, @dirs ) }, No_M => sub { %ad = (); find( \&no_m, @dirs ) }, No_S => sub { %ad = (); find( \&no_s, @dirs ) }, No_Strip => sub { %ad = (); find( \&no_strip, @dirs ) }, Just_Read => sub { %ad = (); find( \&just_read, @dirs ) }, Just_1_Read => sub { %ad = (); find( \&just_one_read, @dirs ) }, } ); sub old { return unless -f $_; open my $fh, '<', $_ or die; while (<$fh>) { last if $_ eq "\n"; $_ = lc $_; if (/\b(andrew\+[^\@\s]+\@[-a-z0-9\.]+)\b/xms) { my $addr = $1; if ( $addr =~ s/[=\#\%](?:3d)?/@/xms ) { $addr =~ s/\@[^@]+$//xms; } $ad{$addr}++; } } close $fh; } sub no_xms { return unless -f $_; open my $fh, '<', $_ or die; while (<$fh>) { last if $_ eq "\n"; $_ = lc $_; if (/\b(andrew\+[^\@\s]+\@[-a-z0-9\.]+)\b/) { my $addr = $1; if ( $addr =~ s/[=\#\%](?:3d)?/@/ ) { $addr =~ s/\@[^@]+$//; } $ad{$addr}++; } } close $fh; } sub no_s { return unless -f $_; open my $fh, '<', $_ or die; while (<$fh>) { last if $_ eq "\n"; $_ = lc $_; if (/\b(andrew\+[^\@\s]+\@[-a-z0-9\.]+)\b/xm) { my $addr = $1; if ( $addr =~ s/[=\#\%](?:3d)?/@/xm ) { $addr =~ s/\@[^@]+$//xm; } $ad{$addr}++; } } close $fh; } sub no_m { return unless -f $_; open my $fh, '<', $_ or die; while (<$fh>) { last if $_ eq "\n"; $_ = lc $_; if (/\b(andrew\+[^\@\s]+\@[-a-z0-9\.]+)\b/xs) { my $addr = $1; if ( $addr =~ s/[=\#\%](?:3d)?/@/xs ) { $addr =~ s/\@[^@]+$//xs; } $ad{$addr}++; } } close $fh; } sub no_x { return unless -f $_; open my $fh, '<', $_ or die; while (<$fh>) { last if $_ eq "\n"; $_ = lc $_; if (/\b(andrew\+[^\@\s]+\@[-a-z0-9\.]+)\b/ms) { my $addr = $1; if ( $addr =~ s/[=\#\%](?:3d)?/@/ms ) { $addr =~ s/\@[^@]+$//ms; } $ad{$addr}++; } } close $fh; } sub no_strip { return unless -f $_; open my $fh, '<', $_ or die; while (<$fh>) { last if $_ eq "\n"; $_ = lc $_; if (/\b(andrew\+[^\@\s]+\@[-a-z0-9\.]+)\b/xms) { $ad{$1}++; } } close $fh; } sub case_insensitive { return unless -f $_; open my $fh, '<', $_ or die; while (<$fh>) { last if $_ eq "\n"; if (/\b(andrew\+[^\@\s]+\@[-a-z0-9\.]+)\b/ixms) { my $addr = $1; if ( $addr =~ s/[=\#\%](?:3[Dd])?/@/xms ) { $addr =~ s/\@[^@]+$//xms; } $ad{$addr}++; } } close $fh; } sub one_read { return unless -f $_; open my $fh, '<', $_ or die; local $/ = ''; $_ = lc <$fh>; close $fh; foreach my $addr (/\b(andrew\+[^\@\s]+\@[-a-z0-9\.]+)\b/gxms) { if ( $addr =~ s/[=\#\%](?:3d)?/@/xms ) { $addr =~ s/\@[^@]+$//xms; } $ad{$addr}++; } } sub one_match { return unless -f $_; my $headers = ''; open my $fh, '<', $_ or die; while (<$fh>) { last if $_ eq "\n"; $headers .= lc $_; } close $fh; if ( $headers =~ /\b(andrew\+[^\@\s]+\@[-a-z0-9\.]+)\b/xms ) { my $addr = $1; if ( $addr =~ s/[=\#\%](?:3d)?/@/xms ) { $addr =~ s/\@[^@]+$//xms; } $ad{$addr}++; } } sub one_read_one_match { return unless -f $_; open my $fh, '<', $_ or die; local $/ = ''; $_ = lc <$fh>; close $fh; if ( my ($addr) = /\b(andrew\+[^\@\s]+\@[-a-z0-9\.]+)\b/xms ) { if ( $addr =~ s/[=\#\%](?:3d)?/@/xms ) { $addr =~ s/\@[^@]+$//xms; } $ad{$addr}++; } } sub just_read { return unless -f $_; open my $fh, '<', $_ or die; while (<$fh>) { last if $_ eq "\n"; } close $fh; } sub just_one_read { return unless -f $_; open my $fh, '<', $_ or die; local $/ = ''; $_ = <$fh>; close $fh; }