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

Jic*_*hao 11 string indexing perl

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

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

Perl 6会支持这种语法吗?

Ran*_*rtz 45

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


Mic*_*man 23

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

  • 字符串是第一类实体(与简单的字符数组相对)并不意味着它不能在语法上被理解为数组.例如,请参阅Java,C#和Delphi. (5认同)

Bra*_*ert 18

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

这就是为什么Perl 6 length被"禁止",而是使用以下之一:

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

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

( split '', $str )[$index];
Run Code Online (Sandbox Code Playgroud)

substr虽然使用它可能更好.

substr $str, $index, 1;
Run Code Online (Sandbox Code Playgroud)


bri*_*foy 12

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

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

  • 顺便说一下,好的写作来自良好的编辑.由于SO的目标是通过Google提供良好的信息,我不断编辑自己的答案. (2认同)

dao*_*oad 9

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

我不使用autobox,但这应该工作:

my $indexed = ('foo'->list)[1];
Run Code Online (Sandbox Code Playgroud)

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

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

my $indexed = 'foo'->[3];
Run Code Online (Sandbox Code Playgroud)

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

至于Perl 6,我没有足够密切地给出一个答案,"如果它不存在而你真的想要它,你将能够自己添加它."

  • Perl 6中没有它,但我认为你应该只能定义一个`multi method postcircumflex:<[]>(Str,Int)`(虽然我不能检查,因为Rakudo还不支持它). (2认同)

Shi*_*rin 7

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

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


Axe*_*man 7

字符串的名称是什么?它是标量,因此显然会有这样的印记$.其余部分遵循标准变量命名标准; 让我们说吧$abc.

my $abc = 'A string';
Run Code Online (Sandbox Code Playgroud)

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

my $def = $abc[2];
Run Code Online (Sandbox Code Playgroud)

是不是标量的第三信$abc,而是从一个阵列的第三个元素-共享相同的符号(但具有不同的印记): @abc.

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

当然,正如布拉德的答案所指出的那样,如果我们对字符串的一部分是"列表"中的"项目"做出隐含的假设,那么只能有意义.你必须使用的编码越多,这些默认假设就越糟糕.

你可能会发现使用autobox更喜欢的语法:

$string->ch( 2 );
Run Code Online (Sandbox Code Playgroud)

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