我编写了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是最好的选择?
答案 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
之类的东西,否则需要正则表达式)