我正在使用以下需要区分的格式解析文本文件。
cat dog [numeric, 00-23]
pickle fence [numeric, 0-5]
tack glue [numeric,1-53]
dent paint [numeric01-15]
如果范围的最小值是一位数,那么我需要以某种方式处理它。如果范围的最小值是两位数(包括00,01,02等),我需要以另一种方式处理它。
if($line =~ /\[numeric.*(\d+)\-(\d+)/i){
$rangemin=$1;
$rangemax=$2;
#find # of digits in $rangemin
#length() doesn't work
#I'm trying to find a function that finds number of digits so length of `00` or `01` or `02` or etc. returns `2`
}
如何找到$rangemin
的数字位数?
答案 0 :(得分:6)
你的正则表达式会抓住前导0,因为.*
非常贪婪。
use warnings;
use strict;
while (my $line = <DATA>) {
if ($line =~ /\[numeric[\D]*(\d+)\-(\d+)/i){
my $rangemin = $1;
my $len = length $rangemin;
print "rangemin=$rangemin len=$len\n";
}
}
__DATA__
cat dog [numeric, 00-23]
pickle fence [numeric, 0-5]
tack glue [numeric,1-53]
dent paint [numeric01-15]
输出:
rangemin=00 len=2
rangemin=0 len=1
rangemin=1 len=1
rangemin=01 len=2
答案 1 :(得分:-1)
您可以使用内置的length,就像使用字符串一样; Perl根据传递给它们的operator / builtin隐式转换参数:
#!perl
use strict;
use warnings;
my $number = 12345;
my $length = $number > 0
? int(log($number)/log(10)) + 1
: $number == 0
? 0
: int(log(abs($number))/log(10)) + 2;
print $length, "\n";
# 5
您还可以使用基数为10的对数来确定数字的长度:
{{1}}
**编辑:正如@Keith Thompson指出的那样,没有为数字&lt; = 0定义日志。使用abs来防止这种情况发生。