string - 如何像 Python 在 Perl 6 中那样对字符串进行切片?

标签 string slice roles raku

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

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

我知道 substrcomb 就足够了,我想知道是否可能,但是。我应该使用角色来做到这一点吗?

最佳答案

如何对字符串进行切片

字符串(表示为类 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/

    相关文章:

    c# - HttpContext.GetOwinContext().GetUserManager<AppRoleManager>() 返回 null

    string - 如何在 slice 中写入函数的结果

    php - 如何获得数组的百分比?

    python - 在 NumPy 中连接 View

    asp.net - 基于基于角色的安全隐藏 Html.ActionLinks

    asp.net-web-api - 如何在ASP.NET MVC Web API中创建角色并将用户添加到角色

    java - 我应该得到 "invalid"作为输出,但我得到 "valid"作为输出,不知道为什么输出是错误的

    regex - 如何在 Ruby 字符串中替换正则表达式匹配之外的内容?

    string - 如何在coffeescript中输出 block 文本,并在所有内容之前添加空格

    amazon-web-services - HITLayoutParameters如何填写