7 votes

expression régulière faisant autorité pour (s)printf FORMAT string

Je voudrais répondre cette question avec

Pour obtenir tout le formatage fantaisiste de Perl et l'accès par clé aux données de hachage, vous besoin d'une (meilleure version de cette) fonction :

# sprintfx(FORMAT, HASHREF) - like sprintf(FORMAT, LIST) but accepts
# "%<key>$<tail>" instead of "%<index>$<tail>" in FORMAT to access the
# values of HASHREF according to <key>. Fancy formatting is done by
# passing '%<tail>', <corresponding value> to sprintf.
sub sprintfx {
  my ($f, $rh) = @_;
  $f =~ s/
     (%%)               # $1: '%%' for '%'
     |                  # OR
     %                  # start format
     (\w+)              # $2: a key to access the HASHREF
     \$                 # end key/index
     (                  # $3: a valid FORMAT tail
                        #   'everything' upto the type letter
        [^BDEFGOUXbcdefginosux]*
                        #   the type letter ('p' removed; no 'next' pos for storage)
         [BDEFGOUXbcdefginosux]
     )
    /$1 ? '%'                           # got '%%', replace with '%'
        : sprintf( '%' . $3, $rh->{$2}) # else, apply sprintf
    /xge;
  return $f;
}

mais j'ai honte de l'approche risquée et brutale pour capturer la "queue" de la chaîne de format.

Alors : Existe-t-il une expression régulière pour la chaîne FORMAT à laquelle on peut se fier ?

1voto

mob Points 61524

Le format acceptable est assez bien spécifié dans le document suivant perldoc -f sprintf . Entre le '%' et la lettre de présentation, vous pouvez avoir :

     (\d+\$)?         # format parameter index (though this is probably
                      # incompatible with the dictionary feature)

     [ +0#-]*         # flags

     (\*?v)?          # vector flag

     \d*              # minimum width

     (\.\d+|\.\*)?    # precision or maximum width

     (ll|[lhqL])?     # size

1voto

ikegami Points 133140

Si vous demandez comment faire exactement comme Perl, alors consultez ce que fait Perl.

Perl_sv_vcatpvfn es sprintf un analyseur et un évaluateur de format. (Lien vers l'implémentation de la 5.14.2).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X