Perl 字符串转换成变量计算

Perl strings into variable calculation

在我的代码中,我在每 15 分钟生成的一堆日志文件中搜索一些信息(虽然时间部分并不那么重要),它给了我特定的输出,如下所示。但这不是我想要的。

我的最终目标是计算输出,这意味着我正在尝试将这串数字转换为变量并计算每家餐厅的总数,然后我想计算所有餐厅的总数。

老实说,我需要跟踪这些数字并计算出我需要的结果。我对目前的情况感到很困惑,所以我需要帮助!

希望我表达清楚了我的顾虑。

示例日志文件:

Total number = 0 for Mcdonalds .....somelog.java:(000)
Total number = 5 for Mcdonalds .....somelog.java:(000)
Total number = 12 for Burger King.....somelog.java:(000)
Total number = 2  for Culvers .....somelog.java:(000)
Total number = 2  for Mcdonalds.....somelog.java:(000)
Total number = 19  for culvers.....somelog.java:(000)
Total number = 0 for Mcdonalds .....somelog.java:(000)
Total number = 0 for Mcdonalds .....somelog.java:(000)
Total number = 0 for Mcdonalds .....somelog.java:(000)
Total number = 19  for culvers.....somelog.java:(000)
Total number = 0  for culvers.....somelog.java:(000)

当前输出

Total number = 5 for Mcdonalds .....somelog.java:(000)
Total number = 12 for Burger King.....somelog.java:(000)
Total number = 2  for Culvers .....somelog.java:(000)
Total number = 2  for Mcdonalds.....somelog.java:(000)
Total number = 19  for culvers.....somelog.java:(000)

我需要的:

Total Number for Mcdonalds = 7
Total Number for Culvers   = 21
Total Number for BK        = 12
Total for all              = 40

Perl 代码

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

use File::Find::Rule;
use Date::Parse;

my ($dir,   $type,  $fh,    $line,  $str_1,
    $str_2 );

$dir = '/dir/test/';
$type = '*';
$str_1           = 'Total Number= 0';

$str_2           = '(java:000)';


my @files = File::Find::Rule->file()->name($type)->in($dir);

open $out, '>>', "output_log" or die "Unable to open 'output_log' : $!";
print $out "\Logs \n";
print $out "--------------------------\n";
close $out or die "Unable to finish writing output_log : $!";

for my $file (@files) {

    open $fh,  '<',  $file        or die "can't open $file: $!";
    open $out, '>>', "output_log" or die "Unable to open 'output_log' : $!";

    while ( $line = <$fh> ) {
# Here I am searching for those which are not equal to zero 
#and which has the tail java:(000)

        if ( $line !~ /$str_1/ && $line =~ /$str_2/ ) {
            print $out $line; #So here my output lines are all which are not zero.
        }
    }

    close $out or die "Unable to finish writing output_log : $!";
}

我假设您得到如图所示的输出。所以我只专注于统一它们的部分

#!/usr/bin/perl
use strict;
use warnings;
my $string = "Total number = 5 for Mcdonalds
    Total number = 12 for Burger King
    Total number = 2  for Culvers
    Total number = 2  for Mcdonalds
    Total number = 19  for culvers";
my @rows = split("\n",$string);
my %hash = ();
foreach my $row (@rows) {
    if($row =~ /(\d+)\s+for\s+(.*)$/i) {
        my $comp = lc();
        if(exists($hash{$comp})) {
            $hash{$comp} = int($hash{$comp}) + int();
        } else {
            $hash{$comp} = int();
        }
    }
}
foreach (keys(%hash)) {
    print $_ . "...." . $hash{$_} . "\n";
}