Самый элегантный и быстрый способ удалить все ведущие нули в строке perl - PullRequest
1 голос
/ 29 мая 2019

Я написал rmlz функцию для обрезки всех лидирующих нулей из строки.

# 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

Есть ли самый элегантный и понятный способ переписать этот код?Или regexp + length + substr - лучший вариант?

Ответы [ 3 ]

6 голосов
/ 29 мая 2019

Простая замена удалит начальные нули:

$str =~ s/^0+(?=[0-9])//;

При этом удаляется столько нулей, сколько возможно, при этом остается хотя бы одна цифра.Последнее ограничение необходимо, чтобы "0" не стало "".

3 голосов
/ 29 мая 2019

Поскольку это, по-видимому, число, можно переформатировать его как таковое (если это целое число)

my $num = sprintf "%d", $num_in_str;

или заставить Perl позаботиться об этом, заставив его обрабатывать строку как число

my $num = 0 + $num_in_str;   # or just:  $num_in_str += 0;

Это правильно для любого типа числа в $num_in_str, и это несравнимо более эффективно, чем sprintf или запуск двигателя регулярных выражений.Хотя это может показаться непростым делом, он будет дома в подпрограмме

sub rmlz { return 0+$_[0] }

, где вы практически платите только за накладные расходы при вызове функции (все еще немного в Perl).

Оба этивыводите предупреждения, если $num_in_str не является действительным числом, что, на мой взгляд, хорошо (если только вам не нужно работать с такими вещами, как 0023a, в этом случае вам нужно регулярное выражение).

1 голос
/ 29 мая 2019

Используйте оператор замены

$str =~ s/^0+//

Замените начало строки, за которым следует 1 или более 0, вместо

if ( $str =~ /^(.[0])/ ) {
    return substr( $str, length($1));
}
.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...