匹配一定数量

时间:2014-01-29 23:16:06

标签: perl

我有一个文件,其中包含很多浮点数:

4.5268e-06 4.5268e-08 4.5678e-01 4.5689e-04 ...

我需要检查是否存在至少一个带有expoenent -1的数字。所以,我用正则表达式编写了这个简短的片段。正则表达式有效,因为我检查过它。但是我在输出中得到的只是1。我知道我遗漏了一些非常基本的东西。请帮忙。

#!usr/local/bin/perl
use strict;
use warnings;

my $i;
my @values;

open(WPR,"test.txt")||die "couldnt open $!";
while(<WPR>)
{
chomp();
push @values,(/\d\.\d\d\d\de+[+-][0][1]/);
}
foreach $i (@values){
print "$i\n";}
close(WPR);

3 个答案:

答案 0 :(得分:4)

正则表达式match operator m(您已省略)如果匹配则返回 true 。 Perl中的 True 通常以1的形式返回。 (请注意,大多数东西都是 true )。

如果您想坚持使用短语法,请执行以下操作:

push @values, $1 if /(\d\.\d\d\d\de+[+-][0][1])/;

答案 1 :(得分:1)

你可以试试这个:

/\d+\.\d+e-01/

答案 2 :(得分:1)

如果我移动括号,它可以正常工作:

push @values,/(\d\.\d\d\d\de+[+-][0][1])/;

如果该线路上有多个匹配项,我最后会添加g

如果您有捕获组和列表上下文,则匹配将返回捕获结果列表。

如果你想把它带到疯狂的结论那么:

my @values = map { /(\d\.\d\d\d\de+[+-][0][1])/g } <WPR> ;

是的,您也可以在列表上下文中使用<WPR>

顺便说一句,虽然你的正则表达式有效,但它可能并不完全是你的意思。例如e+匹配一个或多个e。更简单的可能是:

/\d\.\d{4}e[+-]01/ ;

还有其他问题,例如匹配x.xxxxe+01