【问题标题】:Perl6 assign regex match groups to variablesPerl6 将正则表达式匹配组分配给变量
【发布时间】:2018-11-25 02:43:14
【问题描述】:

在 P5 中,我可以做这样的事情

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

如何在 Perl 6 中做同样的事情?如果我使用相同的语法,$var1 将保存整个 $string 值。

【问题讨论】:

    标签: regex raku


    【解决方案1】:

    该匹配的结果是一个 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 实际上更有帮助?

    【讨论】:

    • 我已经使用 P6 不到一周了,我感觉这根本不是 Perl :-)
    • 在很多方面都像 Perl5,但是如果你期望它以完全相同的方式工作,你可能会出错几次。我可以推荐查看docs.perl6.org/language/5to6-nutshell Perl5 到 Perl6 指南中的指针:)
    【解决方案2】:
    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(.+)/);
    

    【讨论】:

    • 谢谢托马拉克。另一方面,为什么 $match[0] 如果它是一个数组?我以为 P6 中的印记现在改为 @ ?
    • 没错,但在 perl 6 中不再有引用,因此您不必取消引用列表对象即可通过下标访问其各个元素。
    • 我喜欢这种方法而不是 .list。这更像是 Perl-ish :-) 谢谢!
    猜你喜欢
    • 2014-07-20
    • 1970-01-01
    • 2013-01-20
    • 2010-11-17
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    相关资源
    最近更新 更多