【问题标题】:Perl 6 multiple global regex or character substitutionsPerl 6 多个全局正则表达式或字符替换
【发布时间】:2017-10-11 18:11:00
【问题描述】:

在 Perl6 中编写多个字符替换的最佳风格是什么?例如。我想用另一种字母的字母替换一个字母的字母。假设我的第一个“字母”是 abcd 和我的第二个 - efgh,所以我想替换 a → e, b → f, c → g, d → h。使用sed 我会写:

$ echo dcba | sed 'y/abcd/efgh/'
hgfe

据我了解,在 Perl6 中,我应该这样写:

$ echo dcba | perl6 -pe 's:g/a/e/; s:g/b/f/; s:g/c/g/; s:g/d/h/'
hgfe

如果我采用 20-30-40(甚至更多)字符的字母表,这会很不方便。有没有更好的方法来用 Perl6 解决这个问题?

【问题讨论】:

    标签: raku


    【解决方案1】:

    在 Perl6 中有一个音译操作符 tr 与 Perl 5 中一样。在 Perl6 中,还有一种该操作符的方法形式,称为 trans

    echo dcba | perl6 -pe '$_.=trans(["a".."d"] => ["e".."h"])'
    

    输出

    hgfe
    

    【讨论】:

    • 太好了,谢谢! .= 中的 . 是什么意思? trans 将两个列表作为参数,我说得对吗?可以带散列吗?
    • 是的,我已经检查过了,它需要一个哈希值!所以,我的问题只是关于.=
    • @evb 在 Perl 6 中 = 是一个元运算符,可以与大多数中缀运算符结合使用。 a OP= ba = a OP b 相同。这样做是为了让+= 和朋友不再是特殊情况。 (设计的目标之一是尽可能多地删除或扩展特殊情况。)
    • @BradGilbert,谢谢!我很慢地发现 . for methods 也是一个中缀运算符。 :)
    • 仅供参考,简化收益率echo dcba | perl6 -pe '.=trans: "a".."d" => "e".."h"'(因为.foo$_.foo 完全相同;.foo: ....foo(...) 完全相同;显然trans 方法完全相同以range => range 为参数的事物与[range] => [range] 一样)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多