我是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。
答案 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+)
后面使用外观,这将与您在(?<= )
内给出的域旁边的数字匹配
答案 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,请删除第一个打印语句