48

Perl 中的 ,​​ 和 有$this什么@that区别?%those

4

5 回答 5

40

Perl 符号的有用助记符是:

  • $标量
  • @rray
  • %灰

Matt Trout在 blog.fogus.me 上写了一篇关于 Perl sigils的精彩评论,我认为这很有用,所以贴在下面:

实际上,perl 符号并不表示变量类型——它们表示共轭——$ 是“the”,@ 是“these”,% 是“map of”左右——变量类型通过 [] 或 {} 表示。你可以看到这个:

my $foo = 'foo';
my @foo = ('zero', 'one', 'two');
my $second_foo = $foo[1];
my @first_and_third_foos = @foo[0,2];
my %foo = (key1 => 'value1', key2 => 'value2', key3 => 'value3');
my $key2_foo = $foo{key2};
my ($key1_foo, $key3_foo) = @foo{'key1','key3'};

因此,在浏览 perl 代码时查看印记会告诉您您将要得到什么,而不是您正在操作什么。

诚然,在您习惯它之前,这确实令人困惑,但是一旦您习惯了它,它就会成为一个非常有用的工具,可以在浏览代码的同时吸收信息。

当然,你仍然完全有权讨厌它,但这是一个有趣的概念,我认为你可能更喜欢讨厌正在发生的事情,而不是你认为正在发生的事情:)

于 2010-04-28T17:12:02.427 回答
24

$this是一个标量值,它包含 1 个项目,如apple

@that是一个值数组,它包含几个类似("apple", "orange", "pear")

%those是值的散列,它包含键值对,例如 ("apple" => "red", "orange" => "orange", "pear" => "yellow")

有关 Perl 变量类型的更多信息,请参阅perlintro

于 2010-04-28T17:00:45.350 回答
9

Perl 的发明者是一位语言学家,他试图让 Perl 成为一种“自然语言”。

这篇文章

Disambiguation by number, case and word order

Part of the reason a language can get away with certain local ambiguities is that other ambiguities are suppressed by various mechanisms. English uses number and word order, with vestiges of a case system in the pronouns: "The man looked at the men, and they looked back at him." It's perfectly clear in that sentence who is doing what to whom. Similarly, Perl has number markers on its nouns; that is, $dog is one pooch, and @dog is (potentially) many. So $ and @ are a little like "this" and "these" in English. [emphasis added]

于 2010-04-28T18:01:04.607 回答
8

人们经常尝试将 sigils 与变量类型联系起来,但它们只是松散相关。这是我们在学习 Perl有效的 Perl 编程中非常努力的一个主题,因为当你理解了 sigils 时,理解 Perl 会容易得多。

许多人忘记了变量和数据实际上是分开的东西。变量可以存储数据,但你不需要变量来使用数据。

表示单个标$量值(不一定是标量变量):

$scalar_var
$array[1]
$hash{key}

@表示多个值。这可能是整个数组、切片或取消引用:

@array;
@array[1,2]
@hash{qw(key1 key2)}
@{ func_returning_array_ref };

表示对%(键和值),可能是散列变量或取消引用:

%hash
%$hash_ref

在 Perl v5.20 下,%现在可以表示键/值切片或散列或数组:

%array[ @indices ];  # returns pairs of indices and elements
%hash{ @keys };      # returns pairs of key-values for those keys
于 2010-04-28T19:47:19.777 回答
4

您可能需要查看perlintroperlsyn文档,以便真正开始理解 Perl(即阅读翻转手册)。:-)

那说:

  • $this是一个标量,可以存储一个数字(int 或 float)、一个字符串或一个引用(见下文);
  • @that是一个数组,可以存储标量的有序列表(见上文)。push您可以使用orunshift函数将标量添加到数组中(请参阅 参考资料perlfunc),并且您可以使用括号有界的逗号分隔的标量文字或变量列表来创建数组文字(即my @array = ($a, $b, 6, "seven");
  • %those是一个哈希,它是一个关联数组。散列具有条目的键值对,因此您可以通过提供其键来访问散列的值。哈希文字也可以像列表一样指定,除了每个奇数条目是键,每个偶数条目是值。您还可以使用=>字符而不是逗号来分隔键和值。(即,my %ordinals = ("one" => "first", "two" => "second");

通常,当您将数组或散列传递给子例程调用时,各个列表会被展平为一个长列表。这有时是可取的,有时不是。在后一种情况下,您可以使用引用将整个列表的引用作为单个标量参数传递。但是,引用的语法和语义很棘手,超出了这个答案的范围。但是,如果您想查看它,请参阅perlref

于 2010-04-28T17:09:55.320 回答