【问题标题】:Do Perl's sigils have anything to do with memory allocation? [duplicate]Perl 的印记与内存分配有什么关系吗? [复制]
【发布时间】:2011-10-19 06:25:11
【问题描述】:

可能重复:
Why do Perl variables need to start with $, %,@?

没有这个或类似的东西,其他脚本语言似乎相处得很好。
我想这与内存分配和帮助解释器以加快速度有关,但我找不到任何具体的内容。 $scalar 可能会被放入堆栈,@array 放入堆和 %hash?也进堆?那么 ?subroutine 呢?
有人可以帮我解决这个问题或向我指出一些文档吗?我仍在努力掌握一些基础知识并了解一切如何在幕后工作......

【问题讨论】:

  • 这些符号被称为sigils
  • Whitespace 和 Brainf*ck 似乎在不使用任何字母数字符号的情况下相处得很好。只是说。
  • 这必须是一个家庭作业问题。在三个月内,我在昨天看到了这个问题一次,在 SO:here。我提供了一个答案,还有其他几个很好的答案。该线程因偏离主题而关闭。我闻到作业的味道;这些问题太相似,太接近,太以学生为导向。
  • (更正:另外两次;一个是昨天,另一个由@BoltClock 在之前的评论中确定。)
  • 最好的解释是因为$calar和@rray。

标签: arrays perl hash scalar


【解决方案1】:

因为它更容易阅读。

您知道哪些标识符是名词,以及它们是单数还是复数,因为 sigaldry。这与英语中我们有单数和复数限定词和一致的原因相同,如 this species is vs these species are。很高兴知道哪个是哪个。

【讨论】:

  • 所以你会说除了可读性之外没有其他原因?完全是针对程序员的?
  • 只是想确保我正确理解您的答案。正如我在我的问题中指出的那样,很可能符号是解释器的标识符,指示如何在内存中分配变量。
  • 这有什么不同?无论如何,如果你不使用印记,它看起来就像一个裸字字符串,在use strict 下是禁止的。为什么外壳有印记?
  • 为什么你需要 int、str 等。 C? 当然不需要它们,而且大多数“脚本语言”都没有它们。你把它们放在那里供编译器使用。再说一遍:问题不是“印记代表什么”,而是它们对解释器是否有任何意义。如果您可以确保它们是为程序员而设计的,并且只是为了可读性,那么我对此感到满意。这就是为什么我问你是否绝对确定它是否没有别的东西。我从来没有质疑过可读性的重要性和你的成熟度。
  • @shutefan:读者使用印记来快速理解代码。但是它们使编译器可以轻松地允许变量插值、引用解除引用以及 @abc$abc 之间的区分,这是 Perl 中的两个不同变量。如果没有符号,变量插值将需要一些其他元字符,取消引用将需要其他元字符,并且 abc 将不能既是字符串又是完全独立的、独立的数组、散列和函数。所以回答你的问题,是的。编译器也使用印记。
【解决方案2】:

Perl 将与名称相关的所有数据存储在单个符号表条目中。存储在那里的结构称为 typeglob$foo@foo%foo&foo(子例程引用)的值都存储在“foo”的 typeglob 中。整个 typeglob 用*foo 表示(其中* 表示“所有符号”)。所有这些都在perldata section of the Perl documentation 中进行了解释。

【讨论】:

  • 是的,但这并不能真正解释为什么它是这样做的。现有系统意味着 $foo 和 @foo 之间存在(几乎不可见)关联,并且您可以在同一范围内对标量和数组使用相同的标识符——但语言很容易设计不同,无需sigils,并具有不同的符号表组织(例如,参见 Python)。我认为真正的原因是让你一眼就可以通过查看变量的名称来判断它是什么类型的变量。
  • 符号表只适用于包全局变量。词法(my 变量)使用词法填充,它们深埋在 Perl 内部。 perlguts
  • 真正的原因是将变量名与关键字分开。您不必知道所有关键字即可选择名称。
猜你喜欢
  • 2023-03-07
  • 2012-08-05
  • 2017-06-05
  • 2018-12-29
  • 1970-01-01
  • 2010-12-08
  • 2014-08-14
  • 2020-05-08
  • 1970-01-01
相关资源
最近更新 更多