Perl 如何访问我的匿名数组?
以下代码生成按子网连接的客户端平均数量的列表。目前,我必须通过sort | uniq | grep-v HASH对其进行管道传输 试图将其全部保存在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")
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
}