perl6/rakudo: вопрос разыменования
#!perl6
use v6;
my $list = 'a' .. 'f';
sub my_function( $list ) {
for ^$list.elems -> $e {
$list[$e].say;
}
}
my_function( $list );
Сначала я попробовал это в стиле perl5, но это не сработало:
for @$list -> $e {
$e.say;
}
# Non-declarative sigil is missing its name at line ..., near "@$list -> "
Как я мог сделать это в perl6?
3 ответа
Вы не разыменовываете переменные как это в Perl 6. Просто используйте for $list
Но это, вероятно, не будет делать то, что вы хотите сделать. 'a'..'f'
не создает список в Perl 6, а скорее встроенный тип данных Range
, Вы можете проверить это с say $list.WHAT
, Чтобы превратить его в список и перебрать каждый элемент, вы должны использовать for $list.list
Теперь Rakudo 2015.02 работает нормально.
Вы бы лучше использовать @
как ветвь имени переменной как массива.
Perl 6 является контекстно-зависимым языком, поэтому если вы хотите, чтобы массив действовал как "истинный массив", вам лучше дать ему подходящее имя.
#!perl6
use v6;
my @list = 'a' .. 'f';
for @list -> $e { $e.say };
Это должно работать:
.say for @( $list );
.say for $list.list;
.say for $list.flat;
поскольку $list
это скаляр, for $list
будет просто перебирать один элемент.