Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl中Sigils的好处是什么?_Perl_Sigils - Fatal编程技术网

Perl中Sigils的好处是什么?

Perl中Sigils的好处是什么?,perl,sigils,Perl,Sigils,我明白带符号的规则。我可以从列表中进行哈希运算,并将引用传递给平庸的列表。我不理解的是sigils在Perl中提供的好处 我听到的一些原因是: 字符串插值 Ruby具有“#{myVar}”语法,它解决了几乎所有这些问题,包括在不必求助于“@{[$count+1]}”语法的情况下拥有完整的表达式 可读性 IDEs。任何与salt相称的文本编辑器都有语法高亮显示 允许可变子名称间距 允许我将$foo和@foo声明为两个不同的变量只会导致将来的破产 编程语言中一个非常有用的特性是一致性

我明白带符号的规则。我可以从列表中进行哈希运算,并将引用传递给平庸的列表。我不理解的是sigils在Perl中提供的好处

我听到的一些原因是:

  • 字符串插值
    • Ruby具有“#{myVar}”语法,它解决了几乎所有这些问题,包括在不必求助于“@{[$count+1]}”语法的情况下拥有完整的表达式
  • 可读性
    • IDEs。任何与salt相称的文本编辑器都有语法高亮显示
  • 允许可变子名称间距
    • 允许我将$foo和@foo声明为两个不同的变量只会导致将来的破产
编程语言中一个非常有用的特性是一致性。我的好奇心驱使我问,如果我声明一个列表为“@foos”,一个计数器为“$count”,那么需要通过说“$foos[$count]”来访问元素有什么意义?哦但是如果我在列表上下文中读取元素,我可以使用“@”;所以说“@foos[$idx1,$idx2]”现在有意义了!我可以通过观察信号来判断,我将读取一个数组,而不是单个标量

  • 我仍然可以通过说“foos[count]”来判断我正在阅读一个元素
  • 我仍然可以通过说“foos[idx1,idx2]”来判断我正在阅读多个元素
  • 我仍然可以通过说“foos{key}”来判断我正在读取一个值
  • 我仍然可以通过说“foos{key1,key2}”来判断我正在读取多个值

这种模式适用于我能想到的几乎任何情况。无论使用的是哪一个标志,或者没有任何标志,所做事情的意义都是明确的。唯一的区别是,我必须跟踪上下文,并确保符号保持一致

最好的解释是在perldoc中。它们的功能类似于自然语言中的冠词和代词

“$”符号在语义上与英语单词“The”类似,因为它表示需要一个值

整个数组(以及数组和散列的片段)用“@”表示,其工作原理与英语中的单词“this”或“thats”类似,因为它表示需要多个值


Perl 6走了另一条路,因此对它们的值的看法是不同的,但这就是它们背后的理论。

反例:
@foos[$idx1]
给出了一个元素列表,而
$foos[$idx1]
给出了一个标量值?我想你误解了perl的起源。Perl预先确定了在某些语言中工作所需的IDE。也许现在不是这样,但是。。。我仍然觉得能够在一种编程语言中使用基本的文本编辑器是非常有用的。关于“Sigils在Perl中的好处是什么?”,1)Sigils告诉变量的类型,而不必使用匈牙利符号或类似符号。(好吧,你可以说它是匈牙利符号的一种形式。)2)符号允许标量、数组、散列、sub等具有相同的名称。ikegami认为,sigils让vim、npp++和TextMate等文本编辑器提供基于变量类型的语法样式,我发现这很有用。Howie:在一致的世界中,@foos[$idx1]会给你一个元素,将它放入列表就意味着将它放入列表:[@foos][$idx1]]问题是编程不是用自然语言进行的。某些东西不适用。编程需要在语义和定义方面更加严格。无论如何,引用拉里·沃尔的推理并不能回答这个问题。@user63438这不是拉里·沃尔的口头禅,这是关于为什么会这样的Perl文档是的。是的,Perl 6走向了另一个方向,因为它似乎不是很有用。我理解Larry为什么这么做。我想知道,事后来看,它是否有任何实际用途。到目前为止,我还没有听到任何消息,Perl 6选择了一致的sigil方法。如前所述,如果sigil是常量,可以用con替换通风,然后按照惯例替换为空字符串,然后替换为空字符串,我们又回到了没有信号的状态。