Regex 是否有一个内置的perl函数来确定数值变量的长度?

Regex 是否有一个内置的perl函数来确定数值变量的长度?,regex,perl,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 =~ /\[numeri

我正在解析一个文本文件,其格式如下,需要区分

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

您可以使用内置的,就像对字符串一样;Perl根据要传递给的运算符/内置项隐式转换参数:

#!perl 

use strict; 
use warnings; 

my $number = 5; 
print length($number), "\n";
您还可以使用以10为底的对数来确定数字的长度:

#!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
**编辑:正如@Keith Thompson指出的,log不是为数字定义的您可以使用内置的,就像您为字符串定义的那样;Perl根据要传递给的运算符/内置项隐式转换参数:

#!perl 

use strict; 
use warnings; 

my $number = 5; 
print length($number), "\n";
您还可以使用以10为底的对数来确定数字的长度:

#!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

**编辑:正如@Keith Thompson所指出的,log不是为数字定义的正则表达式获取前导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]

您的正则表达式获取前导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]

长度如何?你为什么说它不工作?
length(00)
为我返回
1
。我试图找到一段长度为
00
01
02
等的数字。返回
2
长度(00)返回1,因为它与
长度(0)
长度('0')
相同
length('00')
返回2。@斯蒂芬:是的,
length(00)
确实返回
1
,但这不是问题的原因。这不是字符串与数字的问题,您只是传递了错误的字符串,正如已接受的答案中所解释的。(我添加此评论是为了将来读者的利益。)那么
长度如何?你为什么说它不工作?
length(00)
为我返回
1
。我试图找到一段长度为
00
01
02
等的数字。返回
2
长度(00)
返回1,因为它与
长度(0)
长度('0')
相同
length('00')
返回2。@斯蒂芬:是的,
length(00)
确实返回
1
,但这不是问题的原因。这不是字符串与数字的问题,您只是传递了错误的字符串,正如已接受的答案中所解释的。(我添加此评论是为了将来读者的利益。)我想找到一段数字,以便
05
的长度返回
2
对于非正数
log
方法失败。仅使用
abs
会(a)在
log(0)
上爆炸,以及(b)将报告
-42
的长度是2而不是3。并且它不会解决问题。请参阅已接受的答案。它回答了最初提出的问题:“如何计算数字的长度?”。在我写这篇文章之后,新的信息改变了这个问题。我想找到一段数字,以便
05
的长度返回
2
对于非正数
log
方法失败。仅使用
abs
将(a)在
log(0)
上爆炸(b)将报告
-42
的长度是2而不是3。并且它不会解决问题。请参阅已接受的答案。它回答了最初提出的问题:“如何计算数字的长度?”。在我写这篇文章之后,新的信息改变了这个问题。