J'ai écrit la fonction rmlz
pour supprimer tous les zéros non significatifs de la chaîne.
# remove all leading zeroes from string use strict; use warnings; use feature 'say'; sub rmlz { my ( $str ) = @_; if ( $str =~ /^(.[0])/ ) { return substr( $str, length($1)); } return $str; } say rmlz('0050625'); # must return 50625
Existe-t-il le moyen le plus élégant et le plus clair de réécrire ce code? Ou regexp + length + substr est la meilleure option?
3 Réponses :
Utilisez l'opérateur de remplacement
if ( $str =~ /^(.[0])/ ) { return substr( $str, length($1)); }
Remplacez le début de la chaîne suivi de 1 ou plus 0
par rien au lieu de
$str =~ s/^0+//
Une simple substitution supprimera les zéros non significatifs:
$str =~ s/^0+(?=[0-9])//;
Cela supprime autant de zéros que possible tout en laissant au moins un chiffre. Cette dernière contrainte est nécessaire pour éviter que "0" ne devienne "".
Puisqu'il semble s'agir d'un nombre, peut le reformater en tant que tel (voire un entier)
sub rmlz { return 0+$_[0] }
ou laisser Perl s'en occuper en lui faisant traiter la chaîne comme un nombre
my $num = 0 + $num_in_str; # or just: $num_in_str += 0;
Ceci fait ce qu'il faut pour tout type de nombre dans $ num_in_str
, et c'est incomparablement plus efficace que sprintf code > ou démarrer un moteur regex. Bien que cela puisse paraître délicat, c'est bien dans un sous
my $num = sprintf "%d", $num_in_str;
où vous ne payez pratiquement que pour la surcharge d'appel de fonction (encore un peu en Perl).
Ces deux avertissements d'impression si $ num_in_str
n'est pas un nombre valide, ce qui est bien à mon avis (sauf si vous devez travailler avec des choses comme 0023a
, auquel cas vous veux une expression régulière).
Vous souciez-vous du montant réel?
@DaveSherohman, ouais, je dois supprimer. Merci pour la question, j'ai mis à jour le titre.
Oui, exactement! fixé