Значение `@$array` и других конструкций

Я все еще изучаю Perl 6. Прошу прощения за мое невежество. Я читаю страницу операторов и обнаружил несколько незнакомых конструкций в начале таблицы:

A   Level   Examples
N   Terms   42 3.14 "eek" qq["foo"] $x :!verbose @$array

Я перечитал класс Array и класс Scalar, но не могу найти конструкцию @$xyz в этих разделах. Что означают :! и @$? Есть ли удобное место, где собраны и объяснены все эти символические построения?

Большое тебе спасибо !!


person lisprogtor    schedule 22.06.2017    source источник


Ответы (2)


@$foo — это сокращение от @($foo), где $foo — это переменная элемента, а синтаксис @(...) просто вызывает .list для его аргумента. И метод, и синтаксическая форма иногда называются контекстуализатором списка/массива.

Одно из его применений — когда вы хотите выполнить итерацию по массиву, хранящемуся в контейнере элементов. Контейнер элементов рассматривается встроенными функциями, такими как циклы for, как один элемент, тогда как вызов .list для него возвращает простой массив без окружающего контейнера элементов (т. е. принудительно интерпретирует значение в контексте списка):

my $foo = [1, 2, 3];

say $foo.perl;       # $[1, 2, 3]
say $foo.list.perl;  # [1, 2, 3]
say @$foo.perl;      # [1, 2, 3]

for $foo { ... }       # One iteration
for $foo.list { ... }  # Three iterations
for @$foo { ... }      # Three iterations (identical to the previous line)

:!foo — сокращение от :foo(False), то есть именованный аргумент, имеет значение False:

sub do-something (:$verbose = True) { say $verbose; }

do-something;            # True
do-something :verbose;   # True
do-something :!verbose;  # False

При записи в позиции термина, а не в качестве аргумента списка аргументов, он создает объект Pair. :

say (:!verbose);        # verbose => False
person smls    schedule 22.06.2017

Использование параметра :verbose было бы хорошим способом установить для аргумента Bool значение True с парой двоеточия. Это эквивалентно :verbose(True). :!verbose — это просто отрицание этого, установка его в False, что эквивалентно :verbose(False).

@$ — это способ использования префикса @ для удаления контейнера из скаляра. переменная с сигилом $.

Рассмотреть возможность:

my $x = (1, 2, 3);
.say for $x; 

Выход:

(1 2 3)

vs.

my $x = (1, 2, 3);
.say for @$x; 

Выход:

1
2
3

Большинство операторов можно искать напрямую. Эти два случая, в частности, являются не отдельными операторами, а случаями использования символов в комбинации. Их немного сложнее собрать удобно, но документы улучшаются с каждым днем.

person Curt Tilmes    schedule 22.06.2017