删除perl字符串中所有前导零的最优雅,最快的方法

时间:2019-05-29 13:06:28

标签: string perl substring

我编写了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 个答案:

答案 0 :(得分:6)

一个简单的替换将删除前导零:

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

这将删除尽可能多的零,同时仍保留至少一位数字。 需要后面的约束来防止“ 0”变成“”。

答案 1 :(得分:1)

使用替代运算符

$str =~ s/^0+//

替换字符串的开头,后跟1个或多个0,而不替换

if ( $str =~ /^(.[0])/ ) {
    return substr( $str, length($1));
}

答案 2 :(得分:1)

由于这似乎是一个数字,因此可以将其重新格式化(如果确实是整数)

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之类的东西,否则需要正则表达式)