Perl 如何访问我的匿名数组?

Perl 如何访问我的匿名数组?,perl,hash,Perl,Hash,以下代码生成按子网连接的客户端平均数量的列表。目前,我必须通过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")

以下代码生成按子网连接的客户端平均数量的列表。目前,我必须通过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";
        }
    }
foreach$文件(@ARGV){
打开(FH,$file)或警告(“无法打开文件$file\n”);
如果($file=~/(2009\d{4})/){
$dt=$+;
}
%散列={};
while(){
@字段=拆分(/~/);
$subnet=$fields[0];
$client=$fields[2];
$hash{$subnet}{$client}++;
}
关闭(FH);
$file=“$dt.csv”;
打开(FH,“>$file”)或死亡(“无法打开$file进行输出”);
foreach$子网(排序键%hash){
$tot=密钥(%{$hash{$subnet}});
$days{$dt}{$subnet}=$tot;
打印FH“$subnet,$tot\n”;
推送{$subnet},$tot;
}
关闭(FH);
}
foreach$天(排序键%days){
foreach$子网(排序键%{$days{$day}){
$tot=$i=0;
foreach$amt(@{$subnet}){
$i++;
$tot+=$amt;
}
打印“$subnet,”.int($tot/$i)。“\n”;
}
}
如何在perl之外消除对sort | uniq进程的需求?最后一个foreach获取子网ID,它是数组的“匿名”名称。它会多次生成这些信息(使用子网的每一天一次)

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

事实上,在大多数情况下,像这样的模块使这变得非常容易。您仍然需要像处理CSV或“A1”类型寻址一样处理行,但不必执行导出步骤。然后你就可以输出了

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


在本部分:

foreach $subnet (sort keys %hash) {
        $tot = keys(%{$hash{$subnet}});
        $days{$dt}{$subnet} = $tot;
        print FH "$subnet,$tot\n";
        push @{$subnet}, $tot;
}
$SUNBET是一个字符串,但在最后一条语句中将其用作数组引用。由于您没有启用,它将其视为对名称与$subnet内容相同的变量的软引用。如果你真的想,这没关系,但这很让人困惑。至于澄清最后一部分

更新我猜这就是你要找的,如果子网值以前没有出现过,那么它只会被保存,即使是从另一天开始(?):


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


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

您只是想打印出来吗?请看一看Data::Dumper。您的代码的哪部分工作,哪部分不工作?你想达到什么目的?我不确定问题是什么。但是,使用strict调试代码会更容易:使用strict;使用warnings;(strict会希望你用'my'声明变量)我想做的是消除对perl之外的sort | uniq的需要。我想更好地组织最后一个foreach。忘记你是如何尝试这样做的,告诉我们这个问题。可能有一个更简单的方法。例如,你可以说“我有一个。。。我需要知道谁在某一天使用了哪些子网“。样本输入也很好。:)看到我正在生成csv文件,我想省去一个额外的步骤会更容易。谢谢你的链接。@Anonymous,这更干净了,但它仍然给了我1667条记录,经过sort和uniq之后,这些记录下降到196条。我想要的是一种访问子网值一次的方法…@Anonymous,这要好得多,但仍然会给我哈希(0xab5954)类型的答案。我认为最好的办法是以某种方式消除匿名数组。
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;
            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
}