Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何访问同时具有哈希引用和数组引用的哈希元素_Arrays_Perl_Hash - Fatal编程技术网

Arrays 如何访问同时具有哈希引用和数组引用的哈希元素

Arrays 如何访问同时具有哈希引用和数组引用的哈希元素,arrays,perl,hash,Arrays,Perl,Hash,我有一个散列,它包含几个级别的散列,其中包含数组和散列引用。 因此,我编写了一个类似下面的代码,使用ref($var)的输出访问这两者。 %c是我的哈希。在for循环的第三级之后,我得到了散列引用和数组引用,所以我想访问数组元素。 我正在使用my$array\u ref=[%$new\u value]在我的else循环中访问数组元素。 但我得到了以下错误: Type of arg 1 to keys must be hash (not array dereference) 我的代码: 台词 p

我有一个散列,它包含几个级别的散列,其中包含数组和散列引用。 因此,我编写了一个类似下面的代码,使用
ref($var)
的输出访问这两者。
%c
是我的哈希。在for循环的第三级之后,我得到了散列引用和数组引用,所以我想访问数组元素。 我正在使用
my$array\u ref=[%$new\u value]在我的else循环中访问数组元素。
但我得到了以下错误:

Type of arg 1 to keys must be hash (not array dereference)
我的代码: 台词

print "\t", join "\t", map { %$_ } %$new_values;

包含两个解引用而不是一个,并且
map{…},%hash
会将所有键和值传递给块,因此尝试解引用块内的键将始终失败,因为它不能作为引用

现在还不清楚这些应该是什么。如果
$new\u values
是数组引用,您可能只需要一个值列表,所以您需要

print "\t", join "\t", @$new_values;
或者只是

print "\t$_" for @$new_values; 
但是在散列的情况下,您想查看键还是只查看值?如果是后者,那么你应该写

print "\t", join "\t", values %$new_values;
但是有很多方法可以转储每个哈希元素的键和值。这里有一个建议

print "\t", join ', ', map "$_ => '$new_values->{$_}'", keys %$new_values;
我不明白你在上一节想说什么

my $array_ref = [%$new_values];
my $new_type = ref($array_ref);
print "$new_type\n";
foreach my $key_array ( keys @$array_ref) {
   print "$key_array\n";
}
print "\t", $key_array, "\n\t";
但是很明显,您尝试在
my$array\u ref=[%$new\u values]
中将
$new\u values
作为散列来取消引用
$new\u values
将失败,因为这是在您已确认
$new\u values
是数组引用的块中进行的

另外,行
my$new\u type=ref($array\u ref)
似乎是多余的,因为您刚刚创建了
$array\u ref
作为数组引用,所以
$new\u type
将始终是
array

最后,您的
for
循环
键@$array\u ref
可能并不像您想象的那样。在Perl5版本12之前,这是一个语法错误,但此后它将返回数组索引列表,因此与
0$#$数组\u ref

如果您能更好地解释一下这一部分,我将很乐意帮助您使其工作。

请始终在每个Perl程序的顶部使用strict
和warnings,尤其是在您请求帮助时
print "\t", join ', ', map "$_ => '$new_values->{$_}'", keys %$new_values;
my $array_ref = [%$new_values];
my $new_type = ref($array_ref);
print "$new_type\n";
foreach my $key_array ( keys @$array_ref) {
   print "$key_array\n";
}
print "\t", $key_array, "\n\t";