是否有内置的perl函数来确定数字变量的长度?

时间:2016-03-14 19:46:03

标签: regex perl

我正在使用以下需要区分的格式解析文本文件。

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的数字位数?

2 个答案:

答案 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来防止这种情况发生。