Трудно понять фрагмент кода Perl - PullRequest
1 голос
/ 30 января 2012

Я изучаю существующую программу Perl, которая включает следующую строку кода:

@{$labels->{$set}->{"train"}->{"negative"}} = (@{$labels->{$set}->{"train"}->{"negative"}}, splice(@shuffled, 0, 2000));

Я очень смущен тем, как понимать этот кусок кода.

Ответы [ 3 ]

4 голосов
/ 30 января 2012

Это не действительный Perl как написано:

@{$labels->{$set}->{"train"}->{"negative"}} = (@{$labels->{$set}->{"train"}->{"negative"}};
                                              ^
Syntax error - open parenthesis without a matching close parenthesis

Если вы игнорируете открытые скобки, то выражения LHS и RHS идентичны; он присваивает себе значение массива. Обозначения стрелок -> и {} в основном означают, что вы имеете дело с массивом ref в конце хеш-ссылки на хеш-ссылку на хеш-ссылку или около того. Это в лучшем случае неприятный кусок кода, который нужно понимать, но структура может иметь больше смысла в более широком контексте всей программы (и вся программа будет значительно больше, поэтому я не рекомендую публиковать ее здесь) .


Дважды проверьте свою копию и пасту. Если это на самом деле в сценарии Perl, то его невозможно скомпилировать, тем более выполнить, поэтому вам придется разобраться, как и почему эта строка не работает.

Пересмотренное выражение имеет RHS:

(@{$labels->{$set}->{"train"}->{"negative"}}, splice(@shuffled, 0, 2000));

круглые скобки предоставляют контекст массива или списка; первый член - исходный массив; второе слагаемое является результатом применения splice к массиву @shuffled. Таким образом, splice удаляет пару тысяч элементов (2001?) Из массива @shuffled, и выражение в целом добавляет удаленные элементы в конец массива, идентифицированного комплексным выражением на LHS.

Вероятно, это было бы более эффективно записано как:

push @{$labels->{$set}->{"train"}->{"negative"}}, splice(@shuffled, 0, 2000);

Он также более экономичен при наборе текста и намного более экономичен при работе с клетками головного мозга.

2 голосов
/ 30 января 2012

Утверждение:

@{$labels->{$set}->{"train"}->{"negative"}} = 
    (@{$labels->{$set}->{"train"}->{"negative"}}, splice(@shuffled, 0, 2000));

Делает несколько вещей одновременно.Это также можно записать, немного более многословно:

my @array   = @{$labels->{$set}->{"train"}->{"negative"}};
my @values  = @shuffled[0..1999];   # get the first 2000 values
splice @shuffled, 0, 2000;          # delete the values after use
@array = (@array, @values);         # add the values to the array
@{$labels->{$set}->{"train"}->{"negative"}} = @array;

Как вы заметите, длина в соединении - это не номер элемента массива, а длина массива, поэтому счетчикэто один из фрагментов массива выше.

Как указал Джонатан, гораздо проще использовать push.

push @{$labels->{$set}{"train"}{"negative"}}, splice(@shuffled, 0, 2000);

Документация: сращивание

0 голосов
/ 30 января 2012

$labels является ссылкой на хэш хэшей с тремя глубинами (HoHoH). Поиск $labels->{$set}->{"train"}->{"negative"} возвращает ссылку на массив.

Надеюсь, это немного поможет ..

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