Thread sprintf um rechts im String 0 aufzufüllen (15 answers)
Opened by bianca at 2015-02-14 19:07

FIFO
 2015-02-15 08:24
#179666 #179666
User since
2005-06-01
469 Artikel
BenutzerIn

user image
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 CPAN:Benchmark:

Code (perl): (dl )
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 ) )  },
    }
);

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:
Code: (dl )
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% --

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"

View full thread sprintf um rechts im String 0 aufzufüllen