Код:
@all_matches = grep
{
! ( $seensentence
{
$_->[0] .'-'. $_->[1] .'-'. $_->[5]
}
++ )
}
@all_matches;
Цель: Этот код удаляет дубликаты некоторых элементов из массива @all_matches
, который является AoA.
Моя попытка полного срыва (где ?? .. ?? где я не уверен):
Grep возвращает элементы @all_matches
, которые возвращают true.
Ключ хеша %seensentence
- это три элемента @all_matches
. Поскольку хеш может иметь только уникальные ключи, в первый раз значение увеличивается с undef (0) до 1. В следующий раз это определенное значение, но !
означает, что grep возвращает его, только если undef ( уникальное значение, связанное с этим элементом).
Мои вопросы:
(1) Как я могу превратить {$_->[0] .'-'. $_->[1] .'-'. $_->[5]}++
в HoH?
Мне сказали, что это еще один (идиоматический) способ сделать это. Удар в темноте будет:
( {$_->[0] => 0,
$_->[1] => 0,
$_->[5] => 0} )++
(1b) Потому что Я не понимаю , как оригинал делает то, что я хочу. Я прочитал, что -bareword
эквивалентно "-bareword"
, поэтому я попытался: {"$_->[0]" . "$_->[1]". "$_->[5]"}
, и, похоже, он работал точно так же. Тем не менее я не понимаю: рассматривает ли он каждый элемент как ключ (a) отдельно (как массив ключей) или (b) Правильно : все одновременно (так как .
объединяет их все в одну строку) или это (с) не делает то, что я думаю?
(2) Что это значит: $_->[0] || $_->[1] || $_->[5]
? Это не так, как описано выше.
Я читал, что: логические операторы короткого замыкания возвращают последнее значение, поэтому он будет проверять значение на {$_->[0]}
, и если оно было, я думал, что значение будет увеличиваться, если нет, то будет проверять следующий элемент до ни один из них не был правдой, когда grep передает уникальное значение.
Спасибо за ваше время, я старался быть максимально тщательным (до ошибки?), Но сообщите мне, если чего-то не хватает.