Comment puis-je supprimer tous les zéros de gauche mais laisser un zéro final si la valeur ne contient que des zéros?
par exemple:
my $number = "0000";
Je voudrais avoir:
my $number = "0";
J'ai essayé:
$number =~ s/^0*//;
mais cela supprime bien sûr tous les zéros dans ce cas.
Cela devrait fonctionner:
$number =~ s/^0*(\d+)$/$1/;
0 -> 0
0000 -> 0
0001 -> 1
Edit: c'est un peu trop compliqué. Cela devrait également fonctionner:
$number =~ s/0*(\d+)/$1/;
mais je ne suis pas sûr de ce qui est meilleur dépend du cas d'utilisation.
Vérifiez la réponse de Oesor : c'est plutôt gentil aussi, sans regex impliqué.
Cela n'a pas besoin d'être fait en tant que regex.
my @nums = qw/ 00000 000 000001 002 00000005 00000064 /;
@nums = map { $_ + 0 } @nums;
$number =~ s/^0+(?=\d)//;
Le signe d'anticipation positif garantit qu'il reste au moins un chiffre et l'utilisation de +
au lieu de *
signifie que la substitution est ignorée s'il n'y a pas de zéros au début.
Si vous essayez de normaliser des groupes de nombres dans une seule chaîne, utilisez simplement \b
au lieu de ^
et effectuez une substitution globale:
my $data = "0225 0000 030";
$data =~ s/\b0+(?=\d)//g;
Si votre $number
est un entier, vous pouvez également utiliser printf :
for my $number (qw(005 05 5 000 0 500)) {
printf "%d\n", $number;
}
__END__
5
5
5
0
0
500
Edit: Comme le souligne Ysth, cela fonctionne pour tous les entiers, pas seulement les entiers positifs comme je l’ai dit à l’origine.
Certaines réponses supposent implicitement qu'il n'y a que des chiffres ou que $number
est en fait un nombre. Si ce n'est pas le cas:
s/^0+(?=.)//s
Ou même:
substr($number,0,-1) =~ s/^0+//s
mon $ var = '0000035600000';
$ var = $ var + 0;
C'est tout!
Eh bien, si vous voulez tout remplacer par un, remplacez simplement par s/^0+/0/
?
Cependant, cela remplacera tous les 0 premiers par un 0, donc si vous avez des zéros avant les nombres, vous aurez besoin de la construction de Mats.