1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#!/usr/bin/perl -w use strict; use Benchmark qw( cmpthese ); my $string = "1234567890"; my $new; cmpthese( 0, { "reverse" => sub { $new = scalar reverse( sprintf "%012s", scalar reverse( $string ) ) }, # "regex" => sub { $new = sprintf( "%-12d", $string ) =~ s/ /0/gr }, "regexOld" => sub { ( $new = sprintf( qq( %-12d ), $string ) ) =~ s/ /0/g }, "length" => sub { $new = $string . 0 x ( 12 - length( $string ) ) }, "mult" => sub { $new = $string * 10 ** ( 12 - length( $string ) ) }, } );
1
2
3
4
5
Rate regexOld reverse length mult
regexOld 367554/s -- -84% -88% -91%
reverse 2248428/s 512% -- -28% -45%
length 3123101/s 750% 39% -- -23%
mult 4071761/s 1008% 81% 30% --
2015-02-15T07:24:55 FIFODie Regex-Variante von payx kann ich hier nicht ausführen (Perl 5.12, da geht /r nicht).
($string = sprintf(qq(%-12d),$string)) =~ s/ /0/g;
$string . 0 x (12-length $string)
2015-02-14T20:21:01 betterworldOP schrieb ja:Aber wenn es nur für den Vergleich in sort{} ist, dann kann man sich das Auffüllen auch sparen und einfach ganz normal lexikalisch sortieren.
2015-02-14T18:07:16 biancaIch nehme mal an, das ist z.B. deshalb so, weil die Strings beim cmp (natürlich nicht <=>) noch weitere Bestandteile haben(?).... benötige ich ein sprintf(), das rechts mit 0 auffüllt.
2015-02-14T21:13:33 payxIch nehme mal an, das ist z.B. deshalb so, weil die Strings beim cmp (natürlich nicht <=>) noch weitere Bestandteile haben(?).
2015-02-15T09:08:14 betterworld2015-02-14T21:13:33 payxIch nehme mal an, das ist z.B. deshalb so, weil die Strings beim cmp (natürlich nicht <=>) noch weitere Bestandteile haben(?).
Selbst dann ist die Übung sinnlos, weil es für die Sortierung noch keinen Unterschied macht, ob man nun mit Leerzeichen oder mit Nullen auffüllt.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
#!/usr/bin/perl use strict; use warnings; my @values = ( 12300 , 123 , 123000 ); my @suffixes = ( 'C' , 'B' , 'A' ); for my $i (0..2) { $values[$i] = sprintf("%-12d",$values[$i]) . $suffixes[$i]; } print "Mit Leerzeichen:\n"; print "$_\n" for sort {$a cmp $b} @values; print "Mit Nullen:\n"; @values = map {$_ =~ s/ /0/gr} @values; print "$_\n" for sort {$a cmp $b} @values;
1
2
3
4
5
6
7
8
Mit Leerzeichen:
123 B
12300 C
123000 A
Mit Nullen:
123000000000A
123000000000B
123000000000C
2015-02-14T20:21:01 betterworldAber wenn es nur für den Vergleich in sort{} ist, dann kann man sich das Auffüllen auch sparen und einfach ganz normal lexikalisch sortieren.