在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"
您可以扩展[ ]
此处添加的多候选项以处理运算符为列表提供的所有其他魔法,例如:
从终端指数,例如 $solo[*-1]
截断切片,例如 $solo[3..*]
副词,例如 $solo[3..5]:kv
任务,例如 $solo[2..6] = "slow"
但要做到这一点需要付出很多努力.
另外,请记住,重写内置运算符来执行他们不应该做的事情,会让其他Perl 6程序员感到困惑,他们将来必须审查或使用您的代码.