Perl哈希表超过2维
我正在尝试创建一个具有6维的哈希表:一个哈希表的哈希表,一个哈希表的哈希表。。等 我从本地文件中获取数据(使用REGEX和split函数)。我得到的数据如下:Perl哈希表超过2维,perl,multidimensional-array,hashtable,Perl,Multidimensional Array,Hashtable,我正在尝试创建一个具有6维的哈希表:一个哈希表的哈希表,一个哈希表的哈希表。。等 我从本地文件中获取数据(使用REGEX和split函数)。我得到的数据如下: northPartner1;southServiceCall1;northService1;nbNorthCall1;nbSouthCall1 我想将数据存储在许多哈希表中,用它们来创建HTML数组。我对哈希表不是很熟悉,它对我来说是一个新概念。 问题是我没有创建一个具有多个维度的哈希表 我成功地做到了这一点: #get the dat
northPartner1;southServiceCall1;northService1;nbNorthCall1;nbSouthCall1
我想将数据存储在许多哈希表中,用它们来创建HTML数组。我对哈希表不是很熟悉,它对我来说是一个新概念。
问题是我没有创建一个具有多个维度的哈希表
我成功地做到了这一点:
#get the data
my $serviceN;
my $serviceS;
my $partnerN;
my $nbCallN;
my %northServices= () ;
my %northCall= ();
open (TraficFile, "$date/volumetries.csv") || die "Can't open: $!";
while(defined($_=<TraficFile>)) {
my @champsOutput = split(/\;/);
#get services.
if ($champsOutput[4]=~/Service Call/i){next;}
if ($champsOutput[4]=~/.*@/) {
($serviceS, $serviceN) = split(/@/,$champsOutput[4]);
$partnerN = $champsOutput[0];
}#endif
$nbCallN = $champsOutput[5];
print "nb : $nbCallN \n";
$northServices{$serviceN}{$partnerN}++;
}#while
#Print result
foreach $serviceN (keys %northServices){
print ('***'," $serviceN ",'***',"\n");
foreach my $partnerN ( keys %{ $northServices{$serviceN} } ){
print " $partnerN \n";
}
}
numberOfNorthCall
分为许多南方服务,每个服务都有一个numberOfNorthCall
我真的不知道如何创建其他哈希表来像上面的模型那样封装所有这些数据。
我试图在while()
中创建另一个哈希表,例如:
$northCall{$nbCallN} = $nbCallN;
$serviceNord{$serviceN}{$partnerN}{$northCall{$nbCallN}}++;
我也尝试创建引用:
my $rec = {};
$serviceNord{$serviceN}{$partnerN} = $rec;
$rec->{$nbCallN}++;
这似乎是错误的方法,但我没有找到任何东西来帮助我创建具有两个以上维度的哈希表
如果你知道一种方法,不要犹豫。首先,我建议你尝试做一些完全太复杂的事情。虽然你可以做一个散列的散列等,这将是相当痛苦的。 然而,我认为你问题的根源在于你误解了:
->
和=>
之间的区别。前者解引用散列。后者在功能上等同于逗号
但从根本上说,你没有多维散列,你有一个顶级的散列引用
如果您这样做:
use strict;
use warnings;
my %hash;
$hash{firstlayer}{secondlayer}++;
print $hash{firstlayer};
你会得到一个散列引用
但是,我认为你可能要考虑的是停止使用复杂的嵌套散列,而尝试将一个对象放在一起。(不要拖延——对象基本上是“复杂的数据结构”,可能包含一些代码)
要以声明方式创建嵌套哈希,请执行以下操作:use strict;
use warnings;
use Data::Dumper;
my $value = "value";
my $services = {
key1 => $value,
key2 => {
subkey => $value,
subkey2 => $value,
},
key3 => {
subkey1 => {
subsubkey1 => $value,
subsubkey2 => $value,
},
},
};
print Dumper \$services;
您还可以通过以下方式添加/访问:
print $services->{key3}->{subkey1}->{subsubkey2};
如果您使用%sigil创建了它,例如
my %services = (
#NOTE - different bracket too!
那就是
print $services{key3}{subkey1}{subsubkey2};
它们在功能上是相似的-关键的区别是'->'告诉perl这是要遵循的引用。您使用哪种样式更重要的是,在代码中什么更有意义
<>但是我还是建议考虑做OO样式,并创建一个具有属性的对象。(对象基本上是散列,但可以让您做一些更有趣的事情)
然后你可以:
use strict;
use warnings;
use MyService;
my @services;
my $service = MyService -> new();
push ( @services, $service );
$service -> set_name ( 'nameNorthService1' );
好的,谢谢你的回答!是的,你是对的,当我打印时,我有一个散列参考。。这意味着它不是一个散列的散列?我尝试使用哈希表,因为我们告诉我,在Perl中,哈希表非常好用,但我是这种语言的新手。您是否有一个在Perl中使用object的好链接?再次感谢你,如果你知道怎么做,如果你有时间的话,我很想看看我们如何创建多维哈希:)这并不特别困难-见上面的例子-它很混乱,因为你需要做嵌套的foreach循环。很难给你一个适合,因为我真的不明白你想要实现什么。但是请看编辑。好的,我已经看过很多次这个例子了,这是foreach循环的自动方式,我不知道它是如何工作的^^我已经在寻找用OO风格来做的:)很难看到你想要什么。但是
my%h$h{a}{b}{c}{d}++
将创建一个4维Noal哈希表。如果您不知道如何为多维哈希分配值,那么这将意味着您不知道如何从这样的结构中提取值,这意味着这样做没有意义。即便如此,仅仅为了创建HTML,这可能不是一个好主意。是的,你是对的,但我认为学习这样的结构将是一个好主意。但我有我的答案,我会用物体来做:)
#MyService.pm
use strict;
use warnings;
package MyService;
sub new {
my ( $class ) = @_;
my $self = {};
bless ( $self, $class );
return $self;
}
sub set_name {
my ( $self, $name ) = @_;
$self -> {name} = $name;
}
sub add_partner {
my ( $self, $partner ) = @_;
push ( @{ $self -> {partners} }, $partner );
}
sub get_partners {
my ( $self ) = @_;
return @{ $self -> {partners} };
}
use strict;
use warnings;
use MyService;
my @services;
my $service = MyService -> new();
push ( @services, $service );
$service -> set_name ( 'nameNorthService1' );