当前位置:  开发笔记 > 编程语言 > 正文

如何在Perl 6中像Python一样切片?

如何解决《如何在Perl6中像Python一样切片?》经验,为你挑选了1个好方法。

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

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

我知道substr并且comb已经足够了,我想知道它是否可行,但是.我应该使用角色来做到这一点吗?



1> smls..:

如何切割字符串

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

正如您已经建议的那样,comb或者substr是要走的路:

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"

您可以扩展[ ]此处添加的多候选项以处理运算符为列表提供的所有其他魔法,例如:

从终端指数,例如 $solo[*-1]

截断切片,例如 $solo[3..*]

副词,例如 $solo[3..5]:kv

任务,例如 $solo[2..6] = "slow"

但要做到这一点需要付出很多努力.

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

推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有