我有一个关于完美匹配的问题。我想从文件中得到正整数和负整数之和。我也想让日期在文件中有相同的值。
我的档案:
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
我无法得到正数之和的值。你能帮我吗?
答案 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";