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

6
在Perl6中,我可以像这样做: my ($var1, $var2, $var3) = $string.words; 这将把$string分解为单词,并将其分配给$var1、$var2和$var3。如果您需要使用其他分隔符,请使用.split方法并传递所需的分隔符作为参数。
2个回答

8

匹配结果是一个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 方法 更加有用?

1
我现在使用P6还不到一周,但我感觉这根本不是Perl :-) - Zarul Zakuan
它在很多方面都像Perl5,但是如果你期望它完全以相同的方式工作,你可能会有些困惑。我建议查看https://docs.perl6.org/language/5to6-nutshell,这是一个从Perl5到Perl6的指南 :) - Scimon Proctor

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(.+)/);

1
谢谢Tomalak。另外,为什么要用$match[0],如果它是一个数组?我以为在P6中,符号现在改成了@? - Zarul Zakuan
1
没错,但在 Perl 6 中不再使用引用,因此您无需对列表对象进行取消引用操作即可通过下标访问其各个元素。 - timotimo
1
我喜欢这种方法,而不是使用.list。这更符合Perl的风格 :-) 谢谢! - Zarul Zakuan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接