Perl 反转保留重复值的散列
我现有的哈希是Perl 反转保留重复值的散列,perl,data-structures,hash,hashtable,associative-array,Perl,Data Structures,Hash,Hashtable,Associative Array,我现有的哈希是 my $volvg = { 'datavol' => 'oradatavg', 'archvol' => 'archvg', 'archvol1' => 'archvg', 'soevol' => 'soevg', 'redovol' => 'oradatavg' }; 我想用下面的方法反转散列 $vgvol = { 'oradatavg' => [
my $volvg = {
'datavol' => 'oradatavg',
'archvol' => 'archvg',
'archvol1' => 'archvg',
'soevol' => 'soevg',
'redovol' => 'oradatavg'
};
我想用下面的方法反转散列
$vgvol = { 'oradatavg' => [
'datavol',
'redovol'
], 'archvg' => [
'archvol',
'archvol1
] 'soevg' => [
'soevol'
] };
有人能帮忙吗?就地反转可能是个坏主意,创建一个新的哈希,然后如果需要,将其分配给旧的哈希 下面是一种方法:
#!/usr/bin/perl
use strict;
use warnings;
my $volvg = {
'datavol' => 'oradatavg',
'archvol' => 'archvg',
'archvol1' => 'archvg',
'soevol' => 'soevg',
'redovol' => 'oradatavg'
};
my $reversed;
while( my( $k, $v)= each %$volvg)
{ # $reversed->{$v}||=[]; # not needed, see dgw's comment below
push @{$reversed->{$v}}, $k; # push the old key into the array
}
use DDP; p $reversed; # for checking the result
# you can also use Data::Dumper or other modules
就地反转可能是个坏主意,创建一个新的哈希,然后如果需要,将其分配给旧的哈希 下面是一种方法:
#!/usr/bin/perl
use strict;
use warnings;
my $volvg = {
'datavol' => 'oradatavg',
'archvol' => 'archvg',
'archvol1' => 'archvg',
'soevol' => 'soevg',
'redovol' => 'oradatavg'
};
my $reversed;
while( my( $k, $v)= each %$volvg)
{ # $reversed->{$v}||=[]; # not needed, see dgw's comment below
push @{$reversed->{$v}}, $k; # push the old key into the array
}
use DDP; p $reversed; # for checking the result
# you can also use Data::Dumper or other modules
Perl中有点不清楚的是如何将数组嵌入到哈希中。因为基本上,你不能。没有数组散列这样的东西 但实际上是数组引用的散列。您可以如下操作数组引用:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my $array_ref = [ "one", "two" ];
print Dumper \$array_ref;
push ( @$array_ref, "three-ish" );
print Dumper \$array_ref;
my $hash_ref;
$hash_ref->{"carrot"} = $array_ref;
print Dumper \$hash_ref;
push ( @{$hash_ref->{"carrot"}}, "a new value" );
print Dumper \$hash_ref;
因此,希望您能够看到创建所需数据结构的基础。提取所需的值和键,创建数组ref并将其插入哈希。或者迭代,并使用push Perl中有点不清楚的是,如何将数组嵌入到散列中。因为基本上,你不能。没有数组散列这样的东西 但实际上是数组引用的散列。您可以如下操作数组引用:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my $array_ref = [ "one", "two" ];
print Dumper \$array_ref;
push ( @$array_ref, "three-ish" );
print Dumper \$array_ref;
my $hash_ref;
$hash_ref->{"carrot"} = $array_ref;
print Dumper \$hash_ref;
push ( @{$hash_ref->{"carrot"}}, "a new value" );
print Dumper \$hash_ref;
因此,希望您能够看到创建所需数据结构的基础。提取所需的值和键,创建数组ref并将其插入哈希。或者迭代,并使用push 反转哈希是一个经典的问题/食谱。当被转换成键的值是唯一的时,这个解决方案就很简单了
%rev_hash = reverse %hash ;
但是,正如您所注意到的,这种情况并不常见,因此在其他答案中提供的解释/解决方案是必要的。一旦您理解了引用,就不难了(+++@Sobrique用于创建此链接)
食谱和其他perl资源有时建议tie
-ing散列(例如c.f),以使使用引用更容易
如果要反转本身包含引用的哈希,那么如果必须深入到哈希中,则可能会很棘手。下面是一个简单的示例,它应该反转一个将数组引用作为值的哈希
use DDP;
my $volvg = {
'datavol' => ['oradatavg', 'oradatavgpoo2'] ,
'archvol' => 'archvg',
'archvol1' => 'archvg',
'soevol' => 'soevg',
'redovol' => 'oradatavg' };
while ( ($k,$v) = each(%$volvg) ) {
if (ref $v) {
map { push @{$volvg_rev{$_}}, $k } @$v ;
}
else {
push @{$volvg_rev{$v}}, $k ;
}
}
p $volvg ;
print "----\n";
p %volvg_rev ;
输出:
\ {
archvol "archvg",
archvol1 "archvg",
datavol [
[0] "oradatavg",
[1] "oradatavgpoo2"
],
redovol "oradatavg",
soevol "soevg"
}
----
{
archvg [
[0] "archvol1",
[1] "archvol"
],
oradatavg [
[0] "redovol",
[1] "datavol"
],
oradatavgpoo2 [
[0] "datavol"
],
soevg [
[0] "soevol"
]
}
另一方面,Perl6有一些用于
reverse
-ing、inverse
ing和flip
ping的功能。反转哈希是一个经典的问题/食谱。当被转换成键的值是唯一的时,这个解决方案就很简单了
%rev_hash = reverse %hash ;
但是,正如您所注意到的,这种情况并不常见,因此在其他答案中提供的解释/解决方案是必要的。一旦您理解了引用,就不难了(+++@Sobrique用于创建此链接)
食谱和其他perl资源有时建议tie
-ing散列(例如c.f),以使使用引用更容易
如果要反转本身包含引用的哈希,那么如果必须深入到哈希中,则可能会很棘手。下面是一个简单的示例,它应该反转一个将数组引用作为值的哈希
use DDP;
my $volvg = {
'datavol' => ['oradatavg', 'oradatavgpoo2'] ,
'archvol' => 'archvg',
'archvol1' => 'archvg',
'soevol' => 'soevg',
'redovol' => 'oradatavg' };
while ( ($k,$v) = each(%$volvg) ) {
if (ref $v) {
map { push @{$volvg_rev{$_}}, $k } @$v ;
}
else {
push @{$volvg_rev{$v}}, $k ;
}
}
p $volvg ;
print "----\n";
p %volvg_rev ;
输出:
\ {
archvol "archvg",
archvol1 "archvg",
datavol [
[0] "oradatavg",
[1] "oradatavgpoo2"
],
redovol "oradatavg",
soevol "soevg"
}
----
{
archvg [
[0] "archvol1",
[1] "archvol"
],
oradatavg [
[0] "redovol",
[1] "datavol"
],
oradatavgpoo2 [
[0] "datavol"
],
soevg [
[0] "soevol"
]
}
另一方面,Perl6有一些用于
reverse
-ing、inverse
ing和flip
ping的功能。因此不是为我写一些代码的网站。你必须自己尝试,当你陷入困境时,在这里陈述你的问题,你会得到帮助。你应该展示一些你已经尝试过的工作。所以不是一个为我写一些代码的网站。你必须自己尝试,当你被困在某个地方时,在这里陈述你的问题,然后你会得到帮助。你应该展示你尝试过的一些工作。由于自动激活,没有必要在推上它之前初始化数组。该死,你是对的!谢谢我一直认为,对于“常规”标量来说,自生是有效的,但是如果你想要一个引用,你需要明确。我的错。我学到了一些东西。由于自动激活,在启动之前不需要初始化数组。该死,你说得对!谢谢我一直认为,对于“常规”标量来说,自生是有效的,但是如果你想要一个引用,你需要明确。我的错。我学到了一些东西。回答得好。指出嵌套数据结构中引用的必要性很重要。回答得好。重要的是要指出嵌套数据结构中需要引用。