在 Python 中,我可以像这样拼接字符串:
solo = A quick brown fox jump over the lazy dog
solo[3:5]
我知道
substr
和 comb
就足够了,我想知道是否可能,但是。我应该使用角色来做到这一点吗?
最佳答案
如何对字符串进行切片
字符串(表示为类 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"
您可以扩展此处添加的
[ ]
多候选对象来处理运算符(operator)为列表提供的 all the other magic,例如:$solo[*-1]
$solo[3..*]
$solo[3..5]:kv
$solo[2..6] = "slow"
但是要做到这一切需要付出很多努力。
另外,请记住,覆盖内置运算符来执行他们不应该做的事情,会使其他 Perl 6 程序员感到困惑,他们将来必须审查或使用您的代码。
关于string - 如何像 Python 在 Perl 6 中那样对字符串进行切片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41689023/