为什么Perl不支持normal []运算符来索引字符串?

时间:2009-11-02 15:02:11

标签: perl string indexing

为什么Perl不支持normal []运算符来索引字符串?

几乎所有主流编程语言都支持这个运算符,特别是另外两个'P':Python和PHP。而且,我认为应该很容易实现这个小语法。另外,作为Perl编程语言的哲学 - 尽可能地懒惰,为什么我们懒得使用函数来索引字符串?

Perl 6会支持这种语法吗?

7 个答案:

答案 0 :(得分:45)

到目前为止,我喜欢所有的答案,但真正的答案是,“因为拉里想要那样”。真。拉里想出了一套适合他的成语和工具,他和我们以Perl的形式分享了这些。如果你不认为拉里的想法,那么还有很多其他工具可供使用。我们不需要整个世界使用Perl ...只是那些“得到它”的人就像Larry那样。

答案 1 :(得分:23)

使用[]索引字符串是许多编程语言处理字符串的方式的副作用:作为字符数组(或Unicode字符串中的宽字符)。在Perl中,字符串是一流的实体。 Perl提供了丰富的方法来将整个字符串作为单个值进行处理。如果你试图索引一个字符串,你可能做错了。 (例如,在Perl中编写C而不是使用Perl习语。)对于您确实需要索引字符串的情况,请使用substr

答案 2 :(得分:18)

您想按字节,字符或字素索引吗?

这就是为什么在Perl 6中length is "banned",而是使用以下之一:

  • bytes
    一次只有一个字节
  • chars
    根据源文本,这可以是单个字节,也可以是几个字节。
  • graphs
    这类似于字符,但将多个“组合”字符组合在一起。

如果你真的想要它,你可以使用split做类似的事情。

( split '', $str )[$index];

最好只使用substr

substr $str, $index, 1;

答案 3 :(得分:12)

Perl可以使用indexsubstr索引字符串。它支持操作。它用另一种语法来做它应该不重要。我们有多种编程语言是有原因的。 :)

我不会说[]是一个“正常”的运算符。我相信人们可以列出许多不这样做的语言。

答案 4 :(得分:9)

如果您真的想将标量视为对象,可以使用autobox

我不使用autobox,但这应该有效:

my $indexed = ('foo'->list)[1];

autobox具有用于定义用于包装各种数据类型的对象的挂钩。

所以,如果你真的,真的想要它,你应该能够使用autobox创建自己的字符串类,允许这样的代码:

my $indexed = 'foo'->[3];

所以,我认为你的问题的答案是,“为什么Perl没有[]字符串索引的语法?”是“没有人希望它足以实现它。”

对于Perl 6,我没有足够密切地给出答案,“如果它不存在而你真的想要它,你将能够自己添加它。”

答案 5 :(得分:7)

在Perl中,字符串是标量,因此默认情况下不可订阅。您可以使用substr()index()等函数来访问字符串中的特定字符。

除非Perl 6通过将字符串更改为char的数组来打破这个概念,否则我认为不会对此进行任何更改。

答案 6 :(得分:7)

字符串的名称是什么?它是标量,所以这个印记显然是$。其余部分遵循标准变量命名标准;让我们说$abc

my $abc = 'A string';

由于sigils表示表达式的 context ,并且不是名称的一部分,因此我们发生了冲突。

my $def = $abc[2];

不是标量$abc的第三个字母,而是数组中的第三个字母 - 共享相同的符号(但使用不同的 sigil ):@abc

因此,可能早期为类似脚本的符号解析而设计的表达式已经具有赋予它的含义。

当然,正如 Brad的答案指出的那样,如果我们对字符串的一部分作为“列表”中的“项目”的内容做出隐含的假设,则只有意义。 。您必须使用的编码越多,更糟这些默认假设就越有效。

您可能会使用autobox找到您更喜欢的语法:

$string->ch( 2 );

(你必须自己写ch。)但这比简单地将括号放在字符串上更加冗长。