@$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