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循环。任何人都可以帮我修复它吗? 对不起,这不是完整的代码。请帮帮我。
答案 0 :(得分:2)
%{$portCapability->{@{$memType}}}
这不符合您的意思。
$portCapability->{@{$memType}}
视为哈希引用。@{$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 }) {
...;
}
答案 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