резени хаш

В пълна аналогия с масивните срезове, някои от хеш елементите могат също да бъдат разпределени към хеш срез. Помните ли примера за съхраняване на резултатите от боулинг в %score хеш? Можем да извлечем тези резултати или в списък с хеш елементи, или в срез. Тези два трика са еквивалентни (въпреки че вторият е по-ефективен и заема по-малко място):

Срезът винаги е списък и в нотацията на хеш срез това обстоятелство се обозначава със знака @. Когато срещнете @score< . >, направете това, което Perl прави и забележете @ в началото и фигурните скоби в края. Къдравите скоби означават, че извличате от хеш, а знакът @ означава, че получавате списък с елементи вместо един (към който знакът $ сочи). Както при срезовете на масива, референцията на префиксната променлива ($ или @) дефинира контекста на израза на индекса. С префикс $, изразът се изчислява в скаларен контекст, за да се получи отделен ключ. Но ако започва със знак @, изразът на индекса се оценява в контекста на списъка, за да се получи списък с ключове.

Възниква логичен въпрос: след като говорим за хешове, защо тук не се използва знакът %? Този знак обозначава целия хеш; хеш срез (като всеки друг срез) винаги е списък, а не хеш.

В Perl символът $ винаги обозначава един обект с данни, символът @ обозначава списък, а символът % обозначава целия хеш. Както видяхте при срезовете на масива, хеш срезовете могат да се използват вместо съответния списък с хеш елементи във всички синтактични конструкции на Perl. Така можем да зададем резултатите на някои страни в хеш (без да променяме други елементи на хеша), както следва:

моите @players = qw/barneyфред дино /; моите @bowling_scores = (195, 205, 30); @score < @players >= @bowling_scores;

Последният ред работи точно така, сякаш присвояваме списък от три елемента:

Хеш срезовете също могат да бъдат интерполирани. Следващият пример показва резултатите за избраното от нас трио играчи:

print "Играчите тази вечер бяха: @players\n"; print "Резултатите им бяха: @score\n";