【问题标题】:Sum of Numeric values in PerlPerl中的数值总和
【发布时间】:2019-02-28 22:03:01
【问题描述】:

我是 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 作为参数的代码,我应该得到 sum 为 1000。

【问题讨论】:

标签: regex perl scripting


【解决方案1】:

试试这个模式:

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

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

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

【讨论】:

    【解决方案2】:

    使用(?<=www\.example\.com )(\d+\.\d+) 后面的查找,这将匹配您在(?<= ) 中提供的域旁边的数字

    demo

    【讨论】:

    • 此代码中没有 URL。有一个域,但没有 URL :-)
    【解决方案3】:

    每行数据中有两个以上的数字。您的\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】:

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

      #!/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
      

      【讨论】:

      • 学究式地,www.example.com 是一个域,而不是一个 URL :-)
      • 谢谢,已修复。受到ran_0315回复的影响:)
      【解决方案5】:

      Perl 单行解决方案

      > cat sum_num.txt
      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
      > perl -ne ' { s/(.+)\s+(.+)$/\2/osmg;$x+=$_;print} END { print "Sum=$x\n"} ' sum_num.txt
      986.00
      7627.00
      14.00
      Sum=8627
      >
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-29
        • 1970-01-01
        • 2011-05-18
        • 1970-01-01
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多