Perl6将正则表达式匹配组分配给变量

时间:2018-11-25 02:43:14

标签: regex perl6

在P5中,我可以执行类似的操作

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

在Perl 6中我该怎么做?如果我使用相同的语法,则$ var1将保存整个$ string值。

2 个答案:

答案 0 :(得分:8)

该匹配的结果是Match对象,它本身不会像列表那样运行,因此不会扩展为三个变量。但是,Match对象有一个“列表”方法可以满足您的需求。这是一个示例:

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

需要指出的其他几点:

  • 由于。+是贪婪的匹配,并且也接受空格,因此第一个捕获内容会吃掉两个单词。
  • 当然,问题中的代码是一个简化的示例,但是如果您需要将文本拆分成单词,也许the words method可以满足您的要求。当然,您将需要检查所需的内容:按空格分割?仅返回字母字符,以使句号和逗号不在最终结果中?等
  • 如果您确实需要多次匹配同一事物,那么也许the comb method实际上更有用吗?

答案 1 :(得分:7)

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(.+)/);
相关问题