Perl6 назначает группы соответствия регулярному выражению переменным - PullRequest
0 голосов
/ 25 ноября 2018

В P5 я могу сделать что-то вроде этого

my ($var1, $var2, $var3) = $string =~ /(.+)\s(.+)\s(.+)/;

Как мне сделать то же самое в Perl 6?Если я сделаю тот же синтаксис, $ var1 будет содержать все значение $ string.

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Результатом этого сопоставления является объект Match, который сам по себе не будет вести себя как список, и поэтому не будет расширяться до трех переменных.Однако у объекта Match есть метод «list», который делает то, что вы хотите.Вот пример:

my $string = "hello how are you";
my ($var1, $var2, $var3) =
    ($string ~~ /(.+)\s(.+)\s(.+)/).list;
say "$var1 and $var2 and $var3
# Output: hello how and are and you

Еще несколько вещей, на которые следует обратить внимание:

  • Так как. + - жадное совпадение, и оно также принимает пробелы, первый захват съестдва слова.
  • Конечно, код в вопросе является упрощенным примером, но если вам когда-нибудь понадобится разбить текст на слова, возможно, метод words сделает то, что вы хотите.Конечно, вы захотите проверить, что именно вы хотите: Разделить пробелами?Вернуть только буквенные символы, чтобы точки и запятые не были в конечном результате?и т.д.
  • Если вам нужно несколько раз сопоставить одно и то же, может быть, метод comb на самом деле более полезен?
0 голосов
/ 25 ноября 2018
my $string = 'foo bar baz';

my $match = $string ~~ /(.+)\s(.+)\s(.+)/;
say $match;     # 'foo bar baz'
say $match[0];  # 'foo'
say $match[1];  # 'bar'
say $match[2];  # 'baz'

my ($foo, $bar, $baz) = @$match;
say $foo;       # 'foo'
say $bar;       # 'bar'
say $baz;       # 'baz'

следовательно

my ($foo, $bar, $baz) = @($string ~~ /(.+)\s(.+)\s(.+)/);
...