[Dresden-pm] Perl Mongers erhebet euch

Steffen Schwigon schwigon at webit.de
Fre Jan 27 19:44:34 PST 2006


Steffen Liebergeld <stepardo at gmail.com> writes:
> Hier ist auch schon die erste Programmieraufgabe:
> Zu entwickeln ist eine Methode, welche aus einer gegebenen Textdatei
> ohne Struktur[1] alle E-Mailadressen extrahiert, diese auf Wunsch
> nach Servern, Top-Level Domains oder Username sortiert und das
> Ergebnis zurückgibt.

So, hier endlich meine Beiträge.
Der erste Cmdline-Param ist die gewünschte Sortierung.
Input sind die nächsten Params als Filenamen oder STDIN.

Da E-Mail-Adressen eh' nicht mit Regular Expressions parsebar sind,
verwende ich vereinfacht nur das genügend dicht um '@' stehende Zeug.


Variante 1, ohne "use strict":
------------------------------
$cmd = shift;
$/ = undef; $in = <>;
$re = qr/((\w[^@ ]*)@([\w.]*\.(\w+)))/;
map {
  push @{$res{$2}}, $1 if (/$re/ and $cmd eq 'user');
  push @{$res{$3}}, $1 if (/$re/ and $cmd eq 'server');
  push @{$res{$4}}, $1 if (/$re/ and $cmd eq 'tld');
} $in =~ /$re/g;

print join("\n",
           map {
             join("\n", @{$res{$_}});
           } sort keys %res), "\n";




Variante 2, mit "use strict":
-----------------------------
use strict;
use warnings;

my $cmd = shift;
my $in;
{
  local $/; $in = <>;
}
my $re = qr/((\w[^@ ]*)@([\w.]*\.(\w+)))/;
my %res;
map {
  push @{$res{$2}}, $1 if (/$re/ and $cmd eq 'user');
  push @{$res{$3}}, $1 if (/$re/ and $cmd eq 'server');
  push @{$res{$4}}, $1 if (/$re/ and $cmd eq 'tld');
} $in =~ /$re/g;

print join("\n",
           map {
             join("\n", @{$res{$_}});
           } sort keys %res), "\n";



GreetinX
Steffen 
-- 
Steffen Schwigon <schwigon at webit.de>
Dresden Perl Mongers <http://dresden-pm.org/>