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的功能。

因此不是为我写一些代码的网站。你必须自己尝试,当你陷入困境时,在这里陈述你的问题,你会得到帮助。你应该展示一些你已经尝试过的工作。所以不是一个为我写一些代码的网站。你必须自己尝试,当你被困在某个地方时,在这里陈述你的问题,然后你会得到帮助。你应该展示你尝试过的一些工作。由于自动激活,没有必要在推上它之前初始化数组。该死,你是对的!谢谢我一直认为,对于“常规”标量来说,自生是有效的,但是如果你想要一个引用,你需要明确。我的错。我学到了一些东西。由于自动激活,在启动之前不需要初始化数组。该死,你说得对!谢谢我一直认为,对于“常规”标量来说,自生是有效的,但是如果你想要一个引用,你需要明确。我的错。我学到了一些东西。回答得好。指出嵌套数据结构中引用的必要性很重要。回答得好。重要的是要指出嵌套数据结构中需要引用。