注意理解一段perl代码

时间:2011-12-14 14:50:06

标签: perl

关于以下代码段,

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)

如何一块一块地理解他们的基本逻辑?感谢。

4 个答案:

答案 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

如果$Index1Vector键的值为2.0,则会跳过该键。

答案 2 :(得分:1)

sort使用的变量为小$a$b;该代码无法正常工作,因为在执行比较之前,$A命令未设置变量$Bsort

是时候用use warnings;use strict;编译脚本了。

答案 3 :(得分:0)

  • 循环my - 散列键的排序数组的作用域$Index1变量,存储在散列的Vector中,存储在列表的$Index2$dat1位于dat1
  • 检查同一哈希中的$Index1是否等于2.0

这可能听起来很复杂,任何人都可以尝试将其翻译成人类语言,但没有人能够为你理解它,并且需要你付出一些努力。