Hi bianca,
Bei Deiner Konstruktion muss noch ein
scalar vorangestellt werden, bzw. Du musst den skalaren Kontext sicherstellen.
Noch eine Variante (für numerische Werte):
$string * 10 ** ( 12 - length( $string ) ). Ist wahrscheinlich etwas schneller.
Vergleichen kannst Du mit
Benchmark:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
use strict;
use Benchmark qw( cmpthese );
my $string = "1234567890";
my $new;
cmpthese( 0,
{
"reverse" => sub { $new = scalar reverse( sprintf "%012s", scalar reverse( $string ) ) },
"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 ) ) },
}
);
Die Regex-Variante von payx kann ich hier nicht ausführen (Perl 5.12, da geht /r nicht).
Das nur als Demo. Wenn es wichtig ist, solltest Du ein Testszenario wählen, das Deiner Anforderung entspricht.
Ausgabe:
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% --
Die Ausgabe zeigt die langsamste Variante oben (regexOld).
Gruß, FIFO
EDIT: Die Regex-Variante für Perl < 5.14 ergänzt, vgl. payx' Antwort.
Last edited: 2015-02-15 16:06:22 +0100 (CET)
Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it? -- Brian Kernighan: "The Elements of Programming Style"