Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 删除perl字符串中所有前导零的最优雅、最快速的方法_String_Perl_Substring - Fatal编程技术网

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

String 删除perl字符串中所有前导零的最优雅、最快速的方法,string,perl,substring,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');

我编写了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是最佳选项?

使用替换运算符

$str =~ s/^0+//
将后跟1或多个0的字符串开头替换为nothing,而不是

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

使用替换运算符

$str =~ s/^0+//
将后跟1或多个0的字符串开头替换为nothing,而不是

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

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

$str =~ s/^0+(?=[0-9])//;
这将删除尽可能多的零,同时仍保留至少一个数字。
需要后一个约束来防止0变为。

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

$str =~ s/^0+(?=[0-9])//;
这将删除尽可能多的零,同时仍保留至少一个数字。
需要后一个约束来防止0变为整数。

因为这似乎是一个数字,如果它确实是一个整数,则可以将其重新格式化为整数

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这样的东西,在这种情况下你需要一个正则表达式。

因为这似乎是一个数字,如果它确实是一个整数,那么可以将其重新格式化

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这样的东西,在这种情况下你需要一个正则表达式。

你关心实际金额吗?@DaveSherohman,是的,我需要删除。谢谢你的提问,我更新了标题。是的,没错!修正了你关心实际金额吗?@DaveSherohman,是的,我需要删除。谢谢你的提问,我更新了标题。是的,没错!固定的