【问题标题】:Why do Perl variables need to start with $, %,@ (sigils)?为什么 Perl 变量需要以 $、%、@(符号)开头?
【发布时间】:2022-02-11 22:45:01
【问题描述】:

为什么 Perl 变量需要以不同的字符(符号)开头?

  • 标量变量以$开头

  • 哈希以%开头

  • 数组以@开头

他们为什么会这样?

【问题讨论】:

  • 简短回答:他们没有。考虑数组和哈希。也就是说,这个问题令人困惑。想澄清一下吗?
  • 您是否在问为什么选择了这些特殊的印记(而不是三个不同的印记)?或者为什么会有印记?
  • 我只问了关于 sigils 的问题,然后我意识到为什么其他变量也有这样的。所以我问了所有?
  • Untangled:“我只问过印记,但后来我意识到为什么其他变量也有这样的情况。所以我问了所有。”虽然它仍然没有很有意义。

标签: perl variables


【解决方案1】:

当我开始使用 Perl 时,有人向我解释选择这些字符是因为:

  • $ 看起来有点像“s”,所以这是 scalars,
  • @ 中间有一个“a”,所以这是 a 射线,并且
  • % 用于哈希,因为它看起来像一个键值对除以斜线。

【讨论】:

  • 是的,骆驼书讲述了同样的故事。或者至少,它并没有说它们实际上是因为这些原因而被选中的,但是你可以更好地记住这些助记符所代表的含义。
  • 如果你使用大量诗意的许可证,我也认为 % 看起来有点像哈希的“H”。
【解决方案2】:

这是因为 Perl 使用了sigils:

在计算机编程中,一个印记 (发音为 /'sɪdʒ.ɪl/ 或 /'sɪg.ɪl/; 复数 sigilia 或 sigils) 是一个符号 附加到变量名,显示 变量的数据类型或范围。这 术语首先应用于 Perl 用法 由菲利普·格温在 1999 年取代 更繁琐的“搞笑角色” 变量名的前面”。名称是 基于这个词,意思是一个神奇的 符号(参见印记(魔法))。

【讨论】:

    【解决方案3】:

    几个原因是由 Larry Wall 等人在“Programming Perl”中的explained

    在任何给定的命名空间内 [...] 每个变量类型都有自己的子命名空间,由有趣的角色决定。您可以为标量变量、数组或散列(或者,就此而言,文件句柄、子例程、标签或您的宠物 llama)使用相同的名称,而不必担心冲突。

    [...]

    与大多数计算机语言一样,Perl 有一个保留字列表,可以将其识别为特殊关键字。但是,由于变量名总是以有趣的字符开头,因此保留字实际上不会与变量名冲突。

    【讨论】:

    • 这使 Perl 成为 Lisp 4(如果算上 *GLOB 则为 5)
    • 命名空间保护是印记的一大好处,IMO。 ++!
    • 您还可以在不同的“上下文”中使用变量这一事实难道不会让事情变得非常混乱吗?这难道不是不可能为不同的变量使用相同的名称吗?
    • @temp2290 不。考虑@arr$arr,它们是两个不同的变量。例如,当您在标量上下文中使用 @arr 时,您要么访问单个元素:my $element = $arr[1],要么访问数组的长度:my $length = @arr;。在这两种情况下,它们很容易与标量变量$arr 区分开来。如果$arr 是对数组的标量引用,您可以使用my $element = $arr->[0];$length = @$arr;。恕我直言,至少这些都很容易区分。
    • @cftarnas:我希望您的评论中有多个错误,而不是语言的正确用法。我真的不知道,因为我刚刚开始学习 Perl。无论如何,如果您的目标是证明 Perl 对 sigils 的使用不会令人困惑,我认为您没有成功。也许那些已经掌握 Perl 的人会不同意我的观点。
    【解决方案4】:

    来自Natural Language Principles in Perl

    英语使用数字和词序,代词中带有格系统的痕迹:“男人看着男人,他们回头看着他。”在这句话中,谁在对谁做什么非常清楚。同样,Perl 在其名词上也有数字标记;也就是说,$dog 是一只狗,而 @dog 是(可能)很多只狗。所以$和@有点像英文中的“this”和“these”。

    【讨论】:

      【解决方案5】:
      • 因为 Perl 旨在替换 shell 脚本,而 shell 中的变量以 $ 开头。
      • 区分标量 ($)、数组 (@) 和哈希 (%)。

      【讨论】:

      • 我不会说 perl 旨在替换 shell 脚本,因此保留了 $ sigil(POSIX shell 变量实际上是在没有 $ 的情况下初始化的) - $ sigil 的好处您是否可以在代码中使用/插入变量而无需过多的上下文切换技巧,例如echo "the value of variable foo is $foo"(与 System.out.println("the value of foo is" + foo) 不同,这就是 perl 和 shell 的共同点。Perl 的 $ sigil 更符合您的第二点(表示变量类型/用途)。
      【解决方案6】:

      并非所有人都这样做。有些以 %(哈希)或 @(数组)开头。

      将它们标记为变量并表示它们的类型是一项设计决策。

      请注意,您可以同时拥有 $abc%abc

      查看tutorial on Perl variables

      【讨论】:

      • 符号不表示类型。它们表示您如何对待事物。例如,$abc[1] 仍然使用数组变量,即使前面有一个 $。
      • 这种不一致将在 Perl6 中得到修复,您可以在其中编写 @abc[1] 来访问数组 @abc 中的第二个元素。
      • 假设我们中的任何一个人的寿命都足够长,可以看到 Perl 6 的完整版本。
      • @David:一个有效的问题。我认为 Ray Kurzweil 正在解决这个问题。 ;-)
      • @David Thornley:希望到 2010 年春天你还在! (h-online.com/open/Perl-6-due-in-spring-2010-some-of-it-anyway--/…)
      猜你喜欢
      • 2011-03-05
      • 2011-01-29
      • 2016-05-07
      • 1970-01-01
      • 2013-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-25
      相关资源
      最近更新 更多