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 будет просто перебирать один элемент.

Другие вопросы по тегам