【问题标题】:How can I slice a string like Python does in Perl 6?如何像 Python 在 Perl 6 中那样对字符串进行切片?
【发布时间】:2017-06-01 00:53:45
【问题描述】:

在 Python 中,我可以这样拼接字符串:

solo = A quick brown fox jump over the lazy dog
solo[3:5]

我知道substrcomb 就足够了,我想知道这是否可能,但是。我应该使用角色来执行此操作吗?

【问题讨论】:

    标签: string slice roles raku


    【解决方案1】:

    如何对字符串进行切片

    字符串(表示为 Str 类)在 Perl 6 中被视为单个值而不是位置数据结构,因此无法使用内置的 [ ] 数组索引运算符进行索引/切片。

    正如您已经建议的那样,combsubstr 是要走的路:

    my $solo = "A quick brown fox jumps over the lazy dog";
    
    dd $solo.comb[3..4].join;   # "ui"
    dd $solo.comb[3..^5].join;  # "ui"
    
    dd $solo.substr(3, 2);      # "ui"
    dd $solo.substr(3..4);      # "ui"
    dd $solo.substr(3..^5);     # "ui"
    

    如果要修改切片,请使用substr-rw

    $solo.substr-rw(2..6) = "slow";
    dd $solo;  # "A slow brown fox jumps over the lazy dog"
    

    如何让操作符[ ] 直接作用于字符串

    如果你真的想要,你可以在你的字符串中添加一个角色,添加方法AT-POS,这将使[ ] 操作符在它上面工作:

    my $solo = "A quick brown fox jumps over the lazy dog" but role {
        method AT-POS ($i) { self.substr($i, 1) }
    }
    
    dd $solo[3..5]; ("u", "i", "c")
    

    但是,这会将切片作为列表返回,因为这是 [ ] 运算符默认执行的操作。要让它返回一个连接的字符串,你必须重新实现[ ] 类型Str

    multi postcircumfix:<[ ]>(Str $string, Int:D $index) {
        $string.substr($index, 1)
    }
    multi postcircumfix:<[ ]>(Str $string, Range:D $slice) {
        $string.substr($slice)
    }
    multi postcircumfix:<[ ]>(Str $string, Iterable:D \slice) {
        slice.map({ $string.substr($_, 1) }).join
    }
    
    my $solo = "A quick brown fox jumps over the lazy dog";
    
    dd $solo[3];     # "u"
    dd $solo[3..4];  # "ui"
    dd $solo[3, 5];  # "uc"
    

    您可以扩展此处添加的 [ ] 多候选,以处理运算符为列表提供的 all the other magic,例如:

    • 从头到尾的索引,例如$solo[*-1]
    • 截断切片,例如$solo[3..*]
    • 副词,例如$solo[3..5]:kv
    • 分配,例如$solo[2..6] = "slow"

    但要做到这一切需要付出很多努力。

    另外,请记住,重写内置运算符来做他们不应该做的事情,会让其他 Perl 6 程序员感到困惑,他们将来必须审查或使用您的代码。

    【讨论】:

    • 干得好,说实话,我不会真正重写这些方法。我只想知道 Perl 6 是否可以实现。 Perl 6 太棒了!
    • 一个更好的主意是使用另一对括号来做这件事(ASCII 范围之外的东西会起作用)。
    猜你喜欢
    • 2021-03-12
    • 1970-01-01
    • 2018-10-25
    • 2012-11-20
    • 2011-12-03
    • 1970-01-01
    • 2012-07-13
    • 2014-01-22
    • 2020-12-10
    相关资源
    最近更新 更多