删除 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 字符串中所有前导零的最优雅和最快的方法的主要内容,如果未能解决你的问题,请参考以下文章

从Javascript中的数字中删除前导零[重复]

如何删除字符串中的前导零和尾随零? Python

使用列表理解最佳表达式删除前导零的问题

Excel:如何像数据透视表一样对一系列带有前导零的数字进行排序?

如何删除 Python 中的前导空格?

使用 to_char 函数解析为字符串时,如何从 Oracle 中的日期和月份值中删除前导零?