Jic*_*hao 11 string indexing perl
为什么Perl不支持normal []运算符来索引字符串?
几乎所有主流编程语言都支持这个运算符,特别是另外两个'P':Python和PHP.而且,我认为应该很容易实现这个小语法.另外,作为Perl编程语言的哲学 - 尽可能地懒惰,为什么我们懒得使用函数来索引字符串?
Perl 6会支持这种语法吗?
Ran*_*rtz 45
到目前为止,我喜欢所有的答案,但真正的答案是,"因为拉里想要那样".真.拉里想出了一套适合他的成语和工具,他和我们以Perl的形式分享了这些.如果你不认为拉里的想法,那么还有很多其他工具可供使用.我们并不需要整个世界都使用Perl ......只是那些以Larry的方式"得到它"的人.
Bra*_*ert 18
您想要按字节,字符或字形索引吗?
这就是为什么Perl 6 length被"禁止",而是使用以下之一:
bytescharsgraphs如果你真的想要它,你可以做类似的事情,使用split.
( split '', $str )[$index];
Run Code Online (Sandbox Code Playgroud)
substr虽然使用它可能更好.
substr $str, $index, 1;
Run Code Online (Sandbox Code Playgroud)
如果您真的想将标量视为对象,则可以使用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中,字符串是标量,因此默认情况下不可订阅.您可以使用类似函数substr()或index()访问字符串中的特定字符.
除非Perl 6通过将字符串更改为char的数组来打破这个概念,否则我认为不会对此进行任何更改.
字符串的名称是什么?它是标量,因此显然会有这样的印记$.其余部分遵循标准变量命名标准; 让我们说吧$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自己写.)但这比简单地将括号放在字符串上更加冗长.