代码之家  ›  专栏  ›  技术社区  ›  Scott Hoffman

如何访问我的匿名数组?

  •  1
  • Scott Hoffman  · 技术社区  · 17 年前

    以下代码生成按子网连接的客户端平均数量的列表。目前,我必须通过sort | uniq | grep-v HASH对其进行管道传输。

    试图将其全部保存在perl中这是行不通的:

    foreach $subnet (keys %{keys %{keys %days}}) {
        print "$subnet\n";
    }
    

    资料来源如下:

    foreach $file (@ARGV) {
            open(FH, $file) or warn("Can't open file $file\n");
            if ($file =~ /(2009\d{4})/) {
                $dt = $+;
            }
            %hash = {};
            while(<FH>) {
                @fields = split(/~/);
                $subnet = $fields[0];
                $client = $fields[2];
                $hash{$subnet}{$client}++;
            }
            close(FH);
            $file = "$dt.csv";
            open(FH, ">$file") or die("Can't open $file for output");
            foreach $subnet (sort keys %hash) {
                    $tot = keys(%{$hash{$subnet}});
                    $days{$dt}{$subnet} = $tot;
                    print FH "$subnet,$tot\n";
                    push @{$subnet}, $tot;
            }
            close(FH);
        }
    
        foreach $day (sort keys %days) {
            foreach $subnet (sort keys %{$days{$day}}) {
                $tot = $i = 0 ;
                foreach $amt (@{$subnet}) {
                    $i++;
                    $tot += $amt;
                }
                print "$subnet," . int($tot/$i) . "\n";
            }
        }
    

    2 回复  |  直到 17 年前
        1
  •  2
  •   Anonymous    17 年前

    但这似乎比组合更容易 excel中的电子表格。

    Spreadsheet::ParseExcel 在大多数情况下,让这变得非常容易。您仍然需要像处理CSV或“A1”类型寻址一样处理行,但不必执行导出步骤。然后您可以使用 Spreadsheet::WriteExcel !

    我用这些模块阅读了几百张支票的电子表格,对内容进行了分类、排列和整理,然后写信给一个新的电子表格,交给会计师。


    foreach $subnet (sort keys %hash) {
            $tot = keys(%{$hash{$subnet}});
            $days{$dt}{$subnet} = $tot;
            print FH "$subnet,$tot\n";
            push @{$subnet}, $tot;
    }
    

    $SUNBET是一个字符串,但在最后一条语句中将其用作数组引用。既然你没有 strictures 在上,它将其视为对名称与$subnet内容相同的变量的软引用。如果你真的想,这没关系,但这很让人困惑。至于澄清最后一部分。。。

    使现代化 我猜这就是您要寻找的,子网值只有在以前没有出现过的情况下才会保存,即使是从另一天开始(?):

    use List::Util qw(sum); # List::Util was first released with perl 5.007003 (5.7.3, I think)
    my %buckets;
    foreach my $day (sort keys %days) {
        foreach my $subnet (sort keys %{$days{$day}}) {
            next if exists $buckets{$subnet}; # only gives you this value once, regardless of what day it came in
            my $total = sum @{$subnet}; # no need to reuse a variable
            $buckets{$subnet} = int($total/@{$subnet}; # array in scalar context is number of elements
        }
    }
    
    use Data::Dumper qw(Dumper);
    print Dumper \%buckets;
    
        2
  •  0
  •   Scott Hoffman    17 年前

    基于@Anonymous的建议,我构建了一个子网名称哈希以访问阵列:

    ..

                push @{$subnet}, $tot;
                $subnets{$subnet}++;
        }
        close(FH);
    }
    
    use List::Util qw(sum); # List::Util was first released with perl 5.007003
    
    foreach my $subnet (sort keys %subnets) {
        my $total = sum @{$subnet}; # no need to reuse a variable
        print "$subnet," . int($total/@{$subnet}) . "\n"; # array in scalar context is number of elements
    }
    

    我不确定这是否是最好的解决方案,但我已经没有重复的了。