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

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

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

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

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

Ответ 1

@$foo не подходит для @($foo), где $foo - это переменная item, а синтаксис @(...) просто вызывает .list по его аргументу. Как метод, так и синтаксическую форму иногда называют "контекстуализатором списка/массива", хотя я не могу найти, где синтаксическая форма документирована в официальных документах Perl 6.

Одно использование для него - это когда вы хотите перебирать массив, хранящийся в контейнере элементов. Контейнер элементов считается единственным элементом встроенных элементов, таких как циклы 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), то есть named argument, который имеет значение False

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

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

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

say (:!verbose);        # verbose => False

Ответ 2

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

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

Рассмотрим:

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

Вывод:

(1 2 3)

против.

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

Вывод:

1
2
3

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