@hungry_ewok

Perl, нужна консультация — что делает приведенный код?

Есть код, делающий сравнение двух массивов и заносящий в массив @diff элементы из массива @spisok2, не встречающиеся в массиве @spisok1 :

#! /usr/bin/perl
@spisok1=(1,2,3,4,5,6);
@spisok2=(1,2,3,4,5,7,8);
@diff=();
%seen = ();
@seen{@spisok1} = ();
foreach $item(@spisok2)
       {
         push(@diff, $item) unless exists $seen{$item};
        }
printf ("@diff\n");


Выводит, как и должно :
>7 8

Код был взят где-то в интернетах и использовался 'как есть''.
Сейчас встала необходимость разобраться, и я обнаружил что не понимаю вот эту конструкцию:

@seen{@spisok1} = ();

Подскажите, плз, что это и как оно работает. Ну или где про это прочитать, потому что гуглем ничего внятного не нашлось.
Спасибо.
  • Вопрос задан
  • 242 просмотра
Пригласить эксперта
Ответы на вопрос 2
@pcdesign
В этой строке заполняется хэш с названием %seen.
В качестве ключей этого хеша подставляются элементы массива @spisok1, а в качестве значений пустота.
И если эту строку заменить на цикл, то получится:
for my $element (@spisok1) { 
    $seen{$element} = undef;
}

Эта запись будет эквивалентна вашей строке.
Ответ написан
parserpro
@parserpro
Добавлю, что такая конструкция называется "срез" хэша. Также срез можно применять к массивам (спискам).
Обратите внимание на сигил - он при работе со срезом указывает на массив - @
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы