1
votes

Le moyen le plus élégant et le plus rapide de supprimer tous les zéros non significatifs dans une chaîne perl

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 commentaires

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é


3 Réponses :


1
votes

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+//


0 commentaires

6
votes

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 "".


0 commentaires

4
votes

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).


0 commentaires