关于以下代码段,
foreach my $Index1 (sort { $A <=> $B } keys %{$dat1->{dat1}->[$Index2]->{Vector}})
{
if($dat1->{dat1}->[$Index2]->{Vector}->{$Index1} == 2.0) { next }
printf $sth
}
如何理解my $Index1 (sort { $A <=> $B } keys %{$dat1->{dat1}->[$Index2]->{Vector}})
和($dat1->{dat1}->[$Index2]->{Vector}->{$Index1} == 2.0)
如何一块一块地理解他们的基本逻辑?感谢。
答案 0 :(得分:5)
如果您抽象出嵌套数据结构,它会有所帮助:
my $VectorHashRef = $dat1->{dat1}->[$Index2]->{Vector};
foreach my $Index1 (sort { $A <=> $B } keys %$VectorHashRef ) {
# This should be corrected to $a <=> $b - names are case sensitive
if ($VectorHashRef->{$Index1} == 2.0) {
next;
}
printf $sth;
}
$dat1->{dat1}->[$Index2]->{Vector}
是一种在嵌套数据结构中深入访问某些数据(hashref)的方法。它需要一个hashref $dat1
,访问由散列键"dat1"
指向的数据结构 - 并且该键指向数组引用。您从该数组中获取索引$Index2
- 并且该值是对下一个数据结构(hashref)的引用。您将该哈希值作为键"Vector"
- 这是另一个hashref。
现在,让我们将带有$VectorHashRef
变量的Vector hashref别名(我正在松散地使用别名)。
现在,您正在迭代该hashref的键,以数字方式排序(请参阅Dan的答案以了解其工作原理的详细信息),并针对每个键,将哈希值与2.0
进行比较,仅在价值不是2.0。
要理解这一点,您需要阅读Perl教程中的某些数据结构 - 例如Data Structures Cookbook(又名perldoc perldsc
)
简而言之:
当您看到看似EXPRESSION->{KEY_EXPRESSION}
的内容时,这意味着在hashref中访问值(对于KEY_EXPRESSION指定的键),哈希引用是EXPRESSION
的结果。
当你看到看起来像EXPRESSION->[INDEX_EXPRESSION]
的东西时,这意味着在数组引用中访问值(对于INDEX_EXPRESSION指定的数组下标),数组引用是{{1}的结果}。
答案 1 :(得分:1)
$dat1->{dat1}->[$Index2]->{Vector}
是一个哈希引用,它通过将其放入%{}
来解除引用。
正在使用keys
检索该哈希的密钥。
使用块(see sort
documentation here)中的典型cmp
/ <=>
运算符对这些键进行排序。 请注意,您的排序代码实际上已损坏 - 如链接的文档中所述,soriting块中使用的特殊变量必须为$a
和$b
- 小写
正在迭代生成排序键的结果列表并将其分配给$Index1
。
如果$Index1
中Vector
键的值为2.0,则会跳过该键。
答案 2 :(得分:1)
sort
使用的变量为小$a
和$b
;该代码无法正常工作,因为在执行比较之前,$A
命令未设置变量$B
和sort
。
是时候用use warnings;
和use strict;
编译脚本了。
答案 3 :(得分:0)
my
- 散列键的排序数组的作用域$Index1
变量,存储在散列的Vector
中,存储在列表的$Index2
中$dat1
位于dat1
。$Index1
是否等于2.0 这可能听起来很复杂,任何人都可以尝试将其翻译成人类语言,但没有人能够为你理解它,并且需要你付出一些努力。