Perl - 按客户端#循环计数

时间:2012-05-23 07:24:47

标签: perl

我有以下子计数器来计算每个客户的购买数量。它过去只是/总是4个类别,下面的脚本就足够了。

客户名单:

  • alpha01
  • alpha02
  • alpha03
  • alpha04
  • bravo01
  • bravo02
  • bravo03
  • bravo04

由于列表已增长到> 4,我需要帮助才能修改脚本。 我希望脚本灵活。该脚本可以继续在循环中运行,直到找到可用的最后一个/最大数字(只是一个想法),而不是将“MYClientNo”固定到某个数字/值,然后只有它会停止并返回该值。

例如“alpha”可以升至06,“bravo”升至22.但我预计它不会很快超过100。有人可以帮忙吗?

sub GetCountMyClient {
    my @Line1 = @_;
    my @Count = (0, 0, 0, 0);
    foreach $myclient (@Line1) {
        my @MYClient       = split(/\s+/, $myclient);
        my @MYClientOutput = split(/:/, $MYClient[4]);
        #print $MYClientOutput[0]. "\n";
        my $MYClientNo     = substr($MYClientOutput[0], -2);
        #print $MYClientNo . "\n";
        if($MYClientNo eq "01") {
            $Count[0]+= 1;
        } elsif($MYClientNo eq "02") {
            $Count[1]+= 1;
        } elsif($MYClientNo eq "03") {
            $Count[2]+= 1;
        } elsif($MYClientNo eq "04") {
            $Count[3]+= 1;
        }
    }
    return @Count;
}

PS:我尽力识别代码,它在文本框中看起来是正确的,但不是在预览中。

2 个答案:

答案 0 :(得分:1)

使用哈希(%count),其中哈希键是客户端编号,哈希值是计数。或者,您可以使用具有客户端编号的数组作为数组索引。

sub GetCountMyClient {
    my @Line1 = @_;
    my %count;

    foreach $myclient (@Line1) {
        my @MYClient       = split(/\s+/, $myclient);
        my @MYClientOutput = split(/:/, $MYClient[4]);
        #print $MYClientOutput[0]. "\n";
        my $MYClientNo     = substr($MYClientOutput[0], -2);
        #print $MYClientNo . "\n";
        $count{$MYClientNo}++;
    }
    return %count;
}

答案 1 :(得分:0)

您可能会发现List::UtilsBy count_by可以帮助您。

use List::UtilsBy qw( count_by );

my %count = count_by { $_ =~ m/(\d+)$/ } @client_names;

假设@client_names数组只包含客户端的名称,这将返回一个哈希值,给出每种数字字符串的结束次数。