Perl中的数值总和

时间:2018-09-25 10:01:54

标签: regex perl scripting

我是Perl脚本的新手,现在正在研究一个程序以提高我在Perl中的知识。例如,我有一个输入文件,其中包含模式日期,交易ID,网站名称,金额中的数据,我试图在这里获取在www.example.com中进行的所有交易的总和。由于有两个数字字段(交易ID和金额),因此我无法使用以下命令

仅选择单个值(金额或交易ID)
$var =~ m/(\d+)/

这是示例输入文件。

26/06/2018 12890765 www.example.com 986.00
31/08/2018 17464946 www.other.com 7627.00
1/05/2018  65472345 www.example.com 14.00

现在帮助我如何从文件中仅选择986或7627或14 因此,如果在此处运行带有www.example.com作为参数的代码,则总和应为1000。

5 个答案:

答案 0 :(得分:3)

在空白处分割每一行,检查最后两个元素-如果右第二个元素与程序的第一个参数相同,则将最后一个元素加到总和上。

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

my $domain = shift;

my $sum = 0;
while (<>) {
    my @cells = split;
    $sum += $cells[-1] if $cells[-2] eq $domain;
}
print "$sum\n";

呼叫为

script.pl www.example.com file.txt

答案 1 :(得分:1)

(?<=www\.example\.com )(\d+\.\d+)后面使用外观,这将与您在(?<= )内给出的域旁边的数字匹配

demo

答案 2 :(得分:0)

尝试以下模式:

$var =~ m/.+?www.example.com.+?(\d+\.\d{2})$/m

这应该与字符串/行末尾的数字值匹配,子字符串“ www.example.com”之前出现在字符串/行中。

您感兴趣的值将在捕获组1中(在perl中,我相信它默认为名为$1的变量)。

答案 3 :(得分:0)

每行数据中有两个以上的数字。您的\d+将与该行开头的日期的前几位匹配。

因此,您需要更具体地与您的号码相匹配的商品。我们可以利用您的数字都有小数点这一事实。因此,您的匹配应类似于\d+\.\d+

将所有内容放在一起,您的代码可能类似于:

my $total = 0;
my $domain = 'www.example.com';

while (<>) {
  next unless /\Q$domain/;
  $total += 1 if /(\d+\.\d+)/;
}

say "Total for $domain is $total";

答案 4 :(得分:0)

Perl一线解决方案

responseFields

如果只需要Sum,请删除第一个打印语句