Удалить ведущие нули, но не все нули

Как удалить все начальные нули, но оставить окончательный ноль, если значение содержит только нули?

например:

my $number = "0000";

Я бы хотел:

my $number = "0";

Я пробовал:

$number =~ s/^0*//; 

но это, конечно, удаляет все нули в этом случае.

Ответы

Ответ 1

Это должно работать:

$number =~ s/^0*(\d+)$/$1/;

0    -> 0
0000 -> 0
0001 -> 1

Изменить: получается, что это слишком сложно. Это также должно работать:

$number =~ s/0*(\d+)/$1/;

но я не уверен, что лучше, зависит от варианта использования.

Откажитесь от ответа Oesor: это тоже очень мило, не связано с регулярным выражением.

Ответ 2

Это не нужно делать как регулярное выражение.

my @nums = qw/ 00000 000 000001 002 00000005 00000064 /;
@nums = map { $_ + 0 } @nums;

Ответ 3

$number =~ s/^0+(?=\d)//;

Положительный lookahead гарантирует, что по крайней мере одна цифра оставлена, а использование + вместо * означает, что подстановка пропущена, если нет нужных нулей.

Если вы пытаетесь нормализовать группы чисел в одной строке, просто используйте \b вместо ^ и выполните глобальную замену:

my $data = "0225 0000 030";
$data =~ s/\b0+(?=\d)//g;

Ответ 4

Некоторые ответы подразумевают, что присутствуют только цифры или что $number на самом деле является числом. Если это не так:

s/^0+(?=.)//s

Или даже:

substr($number,0,-1) =~ s/^0+//s

Ответ 5

Если ваш $number является целым числом, другим способом является использование printf:

for my $number (qw(005 05 5 000 0 500)) {
    printf "%d\n", $number;
}

__END__

5
5
5
0
0
500

Изменить: Как указывает ysth, он работает для всех целых чисел, а не только для положительных целых чисел, как я изначально заявил.

Ответ 6

Просто добавьте 0 к строке, чтобы она неявно конвертировалась в число:

my $var = '0000035600000';
$var += 0;

Ответ 7

Ну, если вы хотите заменить все на один, просто измените на s/^0+/0/?

Однако это заменит все ведущие 0 на один 0, поэтому, если у вас есть ведущие нули перед номерами, вам понадобится конструкция Mats.