-1
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 循环。任何人都可以帮我解决它吗?抱歉,这不是完整的代码。请帮我。

4

3 回答 3

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

这并不像你认为的那样。

  1. 您将$portCapability->{@{$memType}}其视为哈希引用
  2. 是在标量上下文中评估的@{$memType},因此给出了数组的大小。

我不太确定你想要什么,但会

%{ $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 }) {
  ...;
}
于 2013-06-18T09:34:00.110 回答
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现在的哪个键。

没有直接的方法可以同时获取多个事物的密钥。这些东西是否是存储在不同键下的相同哈希引用中的哈希引用,或者它们是否是单独的变量都没有关系。你要做的就是自己建立这个列表,依次查看每一件事。这只是用上面的map语句完成的。

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

于 2013-06-18T09:35:02.667 回答
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
于 2013-06-19T11:02:28.167 回答