删除 perl 字符串中所有前导零的最优雅和最快的方法
Posted
技术标签:
【中文标题】删除 perl 字符串中所有前导零的最优雅和最快的方法【英文标题】:Most elegant and fastest way to remove all leading zeroes in perl string 【发布时间】:2019-10-15 02:44:47 【问题描述】:我编写了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 是最好的选择?
【问题讨论】:
你在乎实际金额吗? @DaveSherohman,是的,我需要删除。感谢您的提问,我更新了标题。 是的,没错!固定 【参考方案1】:一个简单的替换将删除前导零:
$str =~ s/^0+(?=[0-9])//;
这会删除尽可能多的零,同时仍保留至少一位数字。 需要后一个约束来防止“0”变成“”。
【讨论】:
【参考方案2】:因为这似乎是一个数字,所以可以重新格式化它(如果确实是一个整数)
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 中很好
sub rmlz return 0+$_[0]
您实际上只需支付函数调用开销(在 Perl 中仍然有点)。
如果$num_in_str
不是有效数字,这两个打印警告,我认为什么是好的(除非您需要使用像0023a
这样的东西,在这种情况下您需要一个正则表达式)。
【讨论】:
【参考方案3】:使用替换运算符
$str =~ s/^0+//
将字符串的开头替换为 1 个或多个 0
,而不是
if ( $str =~ /^(.[0])/ )
return substr( $str, length($1));
【讨论】:
【参考方案4】:$_+=0;
这个问题比正则表达式更容易用数学解决
【讨论】:
以上是关于删除 perl 字符串中所有前导零的最优雅和最快的方法的主要内容,如果未能解决你的问题,请参考以下文章