подстановка текста в массиве perl6 - PullRequest
11 голосов
/ 23 апреля 2019

Я пытаюсь применить текстовую подстановку ко всему массиву.

Однако, когда я пытаюсь изменить массив, он показывает, что он имеет только 1 элемент, тогда как он должен иметь 26.

Пример ниже в Perl6 REPL:

> my @a = 'a'..'z'
[a b c d e f g h i j k l m n o p q r s t u v w x y z]
> my @a1 = @a.subst(/<[aeiou]>/, 1, :g)
[1 b c d 1 f g h 1 j k l m n 1 p q r s t 1 v w x y z]
> @a1.elems
1#this should be 26
> @a.elems
26

как я могу изменить массив с текстовой подстановкой по всему массиву и вернуть массив?

также: perl6сайт не работает, я не могу получить доступ ко многим справочным страницам: (

Ответы [ 2 ]

16 голосов
/ 23 апреля 2019

С помощью гипероператора >>.: он вызывает данный метод для каждого элемента списка и создает список результатов вызова.

my @a = "a".."z";
my @b = @a>>.subst(/ <[aeiou]> /, 1, :g);
dd @a, @b;

# Array @a = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
# Array @b = ["1", "b", "c", "d", "1", "f", "g", "h", "1", "j", "k", "l", "m", "n", "1", "p", "q", "r", "s", "t", "1", "v", "w", "x", "y", "z"]
5 голосов
/ 30 апреля 2019

.subst - это метод Str .

Это означает, что он предполагает, что его первый аргумент (инвокант) является Str .Если это еще не Str , оно преобразуется в Str .

Когда вы вызываете .Str для массива, он объединяет все значения вместес пробелом в качестве разделителя.

my @a = < a b c >;
say @a.perl;       # ["a", "b", "c"]
say @a.Str.perl;   # "a b c"

Таким образом, эти три строки в точности эквивалентны:

@a.subst(/<[aeiou]>/, 1, :g);
@a.Str.subst(/<[aeiou]>/, 1, :g);
@a.join(" ").subst(/<[aeiou]>/, 1, :g);

Perl6 делает это, потому что он непротиворечив.Вы всегда знаете, что вывод одного вызова .subst - это один Str .Вы также знаете, что инвокант обрабатывается как Str .

Если бы он делал что-то другое с массивами, стало бы трудно отследить, какие методы меняются в зависимости от того, кто там работает, и как ониизменить.

Нам нужно только взглянуть на Perl5, чтобы увидеть, как трудно запомнить каждую причуду каждой функции, когда они не согласованы.
(Попробуйте подумать обо всех функциях в Perl5, которыеработать с $_ по умолчанию, и то, что они делают в контексте скаляра и списка.)


Вместо вызова .subst для одного значения массива, вы хотите вызвать его для каждого иззначения, которые он содержит.

Есть несколько способов сделать это:

my @ = @a.map( *.subst(…) )

my @ = @a».subst(…)

my @ = do for @a { .subst(…) }

my @ = @a.duckmap( -> Str $_ { .subst(…) } ) # only change Str's
...