Относитесь к пониманию части кода на Perl - PullRequest
1 голос
/ 14 декабря 2011

Относительно следующего сегмента кода,

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 ]

5 голосов
/ 14 декабря 2011

Это помогает, если вы абстрагируете вложенную структуру данных:

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.

1 голос
/ 14 декабря 2011

Переменные, используемые sort: $a и $b в нижнем регистре;этот код не будет работать должным образом, поскольку переменные $A и $B не устанавливаются командой sort перед выполнением сравнения.

Настало время скомпилировать сценарий с use warnings; и use strict;.

1 голос
/ 14 декабря 2011

$dat1->{dat1}->[$Index2]->{Vector} - это ссылка на хеш, разыменовывается путем помещения его в %{}.

Ключи для этого хэша извлекаются с помощью keys.

Эти ключи сортируются с использованием типичного оператора cmp / <=> в блоке ( см. Документацию sort здесь ). Обратите внимание, что ваш код сортировки фактически не работает - как отмечено в связанной документации, специальные переменные, используемые в блоке сортировки, должны быть $a и $b - в нижнем регистре

Полученный списокотсортированные ключи повторяются и присваиваются $Index1.

Если значение ключа $Index1 в Vector равно 2,0, то ключ пропускается.

0 голосов
/ 14 декабря 2011
  • Loop my -scoped $Index1 Переменная отсортированного массива ключей хеша, хранящегося в Vector хеша, хранящегося в $Index2 списка, помещенного в $dat1, имеетdat1.
  • проверить, равен ли $Index1 в том же хеше 2,0

, это может показаться сложным, любой может попытаться перевести его на человеческий язык, но нетэто можно понять за вас, и это потребует некоторых усилий на вашей стороне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...