如何在哈希引用中声明数组引用

时间:2013-06-18 09:26:27

标签: perl perl-data-structures hashref arrayref

my $memType = [];
my $portOp = [];
my $fo = "aster.out.DRAMA.READ.gz";
    if($fo =~/aster.out\.(.*)\.(.*)\.gz/){
      push (@{$memType},$1);
      push (@{$portOp},$2);
    }
  print Dumper @{$memType};
  foreach my $mem (keys %{$portCapability->{@{$memType}}}){
//How to use the array ref memType inside a hash//
    print "entered here\n";
   //cannot post the rest of the code for obvious reasons//
}

我无法进入foreach循环。任何人都可以帮我修复它吗? 对不起,这不是完整的代码。请帮帮我。

3 个答案:

答案 0 :(得分:2)

%{$portCapability->{@{$memType}}}

这不符合您的意思。

  1. 您将$portCapability->{@{$memType}}视为哈希引用
  2. @{$memType}在标量上下文中进行评估,从而给出数组的大小。
  3. 我不太确定你想要什么,但是

    %{ $portCapability->{ $memType->[0] } }
    

    工作?

    但是,如果您要对$portCapability中的元素进行切片,则需要一些想法

    @{ $portCapability }{ @$memType }
    

    这将评估为hashrefs列表。然后,您可以遍历hashrefs,并在内部循环中循环键:

    for my $hash (@{ $portCapability }{ @$memType }) {
      for my $key (keys %$hash) {
        ...;
      }
    }
    

    如果你想要一个内部哈希的所有键的平面列表,但不需要自己的哈希值,你可以将上面的代码缩短为

    for my $key (map {keys %$_} @{ $portCapability }{ @$memType }) {
      ...;
    }
    

答案 1 :(得分:1)

我认为你想要的是:

my $foo = { 
  asdf => { 
    a => 1, b => 2, 
  }, 
  foo => {
    c => 3, d => 4 
  }, 
  bar => {
    e => 5, f => 6 
  }
};
my @keys = qw( asdf foo );

foreach my $k ( map { keys %{ $foo->{$_} } } @keys ) {
  say $k;
}

但您不知道这些$k中的哪一个属于$foo的哪个键。

没有直接的方法可以同时获取多件事物的钥匙。如果这些东西是存储在不同键下的相同hashref中的hashref,或者它们是单独的变量,则无关紧要。你要做的就是自己构建那个列表,依次查看每个事物。这只是通过以上map语句完成的。

首先,查看$foo中的所有密钥。然后,对于其中的每一个,返回该元素内的键。

答案 2 :(得分:0)

my $memType = [];
my $portOp = [];
my $fo = “aster.out.DRAMA.READ.gz”;
   if ($fo =~ /aster.out\.(\w+)\.(\w+)\.gz/ ) { #This regular expression is safer
    push (@$memType, $1);
            push (@$portOp, $2);
  }
print Dumper “@$memType”; #should print “DRAMA”
#Now if you have earlier in your program the hash %portCapability, your code can be:
foreach $mem (@$memType) { 
    print $portCapability{$mem};
}
#or if you have the hash $portCapability = {…}, your code can be:
foreach $mem (@$memType) {
    print $portCapability->{$mem};
} 
#Hope it helps