Это помогает, если вы абстрагируете вложенную структуру данных:
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}
- это способ получить доступ к некоторому фрагменту данных (хэш-памяти) глубоко в структуре вложенных данных.Он принимает хеш-значение $dat1
, обращается к структуре данных, на которую указывает ключ хеш-функции "dat1"
, и этот ключ указывает на ссылку на массив.Вы берете значение из этого массива с индексом $Index2
- и это значение является ссылкой на следующую структуру данных (hashref).Вы берете значение этого хеша для ключа "Vector"
- это еще один хеш-адрес.
Теперь давайте назовем псевдоним этого хеш-значения Vector с переменной $VectorHashRef
(я использую слово псевдоним свободно).
Теперь вы перебираете ключи этого хэш-значения, отсортированные численно (подробности о том, как это работает, см. Ответ Дэна), и для каждого ключа сравниваете значение хеш-функции с 2.0
, печатая что-либо, только если значениеэто НЕ 2.0.
Чтобы хорошо это понять, вам нужно прочитать некоторые структуры данных в учебнике по Perl - например, Поваренная книга структур данных (он же perldoc perldsc
)
Inshort:
Когда вы видите что-то похожее EXPRESSION->{KEY_EXPRESSION}
, это означает доступ к значению (для ключа, указанного в KEY_EXPRESSION) в хэш-функции, причем ссылка на хеш является результатомEXPRESSION
.
Когда вы видите что-то похожее EXPRESSION->[INDEX_EXPRESSION]
, это означает доступ к значению (для индекса, указанного в INDEX_EXPRESSION) в ссылке на массив, с помощьюссылка на массив является результатом EXPRESSION
.