完美匹配无效

时间:2014-06-02 23:05:00

标签: perl

我有一个关于完美匹配的问题。我想从文件中得到正整数和负整数之和。我也想让日期在文件中有相同的值。

我的档案:

Hello  -12, 3.4 and 32. Where did you
go on 01/01/2013 ? On 01/01/2013, we
went home. -4 plus 5 makes 1.
03/02/2013

我应该得到的结果:

-16    //the sum of negative integers.
38     //the sum of positive integers.
2      //total number of unique dates :)

我的代码是:

$sum=0;
$summ=0;
while (<>) {
    foreach ($_=~ /-\d+/g)
    {
        $sum+=$_;
    }
    foreach ($poz=~ /^\d+?$/g) {
        $summ+=$poz;
    }
    foreach (/\d{2}\/\d{2}\/\d{4}/) {
        $count++;
    }
}
print "$sum\n"; 
print "$summ\n";
print "$count\n";

我得到的输出是:

-16
0
2

我无法得到正数之和的值。你能帮我吗?

1 个答案:

答案 0 :(得分:2)

首先,总是使用use strict; use warnings;。它会发现你的第一个错误:使用$poz而不给它一个值。两次!

正整数是序列

  • 前面没有-
  • 前面没有数字。
  • 前面没有.
  • 前面没有/
  • 由数字组成
  • 未跟.加数字后跟。 (好吧,你可能会认为4.0是一个整数,但我对此表示怀疑。)
  • 后面没有数字。
  • 未跟/

(?<![\-\d./])\d+(?![\d/])(?!\.\d)

负整数是序列

  • -后跟数字
  • 组成
  • 未跟.加数字后跟。 (好吧,你可能会认为4.0是一个整数,但我对此表示怀疑。)
  • 后面没有数字。

-\d+(?!\d)(?!\.\d)

所以,

use strict;
use warnings;

my $sum_p = 0;
my $sum_n = 0;
my $dates = 0;

while (<>) {
    $sum_p += $_ for /(?<![\-\d.\/])\d+(?![\d\/])(?!\.\d)/g;
    $sum_n += $_ for /-\d+(?!\d)(?!\.\d)/g;
    ++$dates while /\d{2}\/\d{2}\/\d{4}/g;
}

print "$sum_p\n"; 
print "$sum_n\n";
print "$dates\n";