[Dresden-pm] Perl Mongers erhebet euch
A. Pagaltzis
pagaltzis at gmx.de
Don Jan 19 06:32:27 PST 2006
* Sven Klemm <sven at elektro-klemm.de> [2006-01-19 10:45]:
>#!/usr/bin/env ruby
>
>raise ArgumentError, "Usage: #{$0} <file>" unless ARGV.length >= 1
>email = []
>File.new(ARGV[0]).read.scan(/([\w_.+-]+)@([\w.+_-]+\.)+(\w{2,3}|\d{1,3})/) do | user , server, tld |
> email.push({:user=>user,:server=>server,:tld=>tld})
>end
>
>puts "Please set the sort order 1 = user, 2 = server, 3 = top level domain:\n"
>order = case STDIN.gets.strip
> when '2' then [:server,:tld,:user]
> when '3' then [:tld,:server,:user]
> else [:user,:server,:tld]
>end
>
>email.sort! do | a, b |
> d = 0
> order.each do | o |
> d = a[o].downcase <=> b[o].downcase
> break unless d == 0
> end
> d
>end
>
>email.each do | e | puts "#{e[:user]}@#{e[:server]}#{e[:tld]}" end
Das ganze 1:1 in Perl:
#!/usr/bin/perl
my @email;
die "Usage: $0 <file>" if @ARGV > 1;
while( <> ) {
while( /([\w_.+-]+)@([\w.+_-]+\.)+(\w{2,3}|\d{1,3})/g ) {
push @email, { user => $1, server => $2, tld => $3 };
}
}
print "Please set the sort order 1 = user, 2 = server, 3 = top level domain:\n";
my @order = do {
$_ = <STDIN>;
/^2$/ ? qw( server tld user ) :
/^3$/ ? qw( tld server user ) :
qw( user server tld );
};
@email = sort {
my $d = 0;
for( @order ) {
$d = lc $a{ $_ } cmp lc $b{ $_ };
last unless $d == 0;
}
$d;
};
for( @email ) {
print "$$_{user}\@$$_{server}$$_{tld}";
}
__END__
Allerdings ist das »die« in der Perl-Version überflüssig, weil
der `<>`-Operator selbständig beliebig viele Eingabedateien
entgegennimmt (und bei Abwesenheit von Argumenten auf STDIN
ausweicht).
Und insgesamt ist das relativ holprig. Ich würd’s anders
ausdrücken.
Gruss,
--
#Aristoteles
*AUTOLOAD=*_;sub _{s/(.*)::(.*)/print$2,(",$\/"," ")[defined wantarray]/e;$1};
&Just->another->Perl->hacker;