[英]What is the difference between `$this`, `@that`, and `%those` in Perl?
Perl中的$this
,@ @that
和%those
什么区别?
Perl sigils的一个有用的助记符是:
Matt Trout在blog.fogus.me上写了一篇关于Perl sigils的评论,我觉得它很有用,所以粘贴如下:
实际上,perl sigils并不表示变量类型 - 它们表示共轭 - $是'the',@是'这些',%是'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代码时会看到这个印记,告诉你你要做什么 - 而不是你正在操作的东西,几乎就是这样。
不可否认,这一点在您习惯之前确实令人困惑,但是一旦您习惯了它,它就可以成为一个非常有用的工具,可以在浏览代码时吸收信息。
当然,你仍然完全有权讨厌它,但这是一个有趣的概念,我认为你可能更喜欢讨厌实际发生的事情,而不是你认为发生的事情:)
$this
是一个标量值,它包含1个项目,如apple
@that
是一个值数组,它有几个像("apple", "orange", "pear")
%those
是值的哈希值,它保存键值对,如("apple" => "red", "orange" => "orange", "pear" => "yellow")
有关Perl变量类型的更多信息,请参阅perlintro 。
Perl的发明者是语言学家,他试图让Perl成为一种“自然语言”。
从这篇文章 :
按数字,案例和单词顺序消除歧义
语言可以通过某些局部模糊性消失的部分原因是其他歧义被各种机制所抑制。 英语使用数字和单词顺序,在代词中用案例系统的痕迹:“男人看着男人,他们回头看着他。” 在这句话中,对于向谁做的事情是完全清楚的。 同样,Perl在其名词上有数字标记; 也就是说,$ dog是一个狗,而@dog(可能)很多。 所以$和@有点像英语中的“this”和“these” 。 [强调补充]
人们经常尝试将符号绑定到变量类型,但它们只是松散相关。 这是我们在学习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
您可能需要查看perlintro
和perlsyn
文档才能真正开始理解Perl(即阅读翻转手册)。 :-)
那说:
$this
是一个标量,可以存储一个数字(int或float),一个字符串或一个引用(见下文); @that
是一个数组,可以存储一个有序的标量列表(见上文)。 您可以使用push
或unshift
函数向数组添加标量(请参阅perlfunc
),您可以使用括号括号的逗号分隔的标量文字或变量列表来创建数组文字(即, my @array = ($a, $b, 6, "seven");
) %those
是哈希,它是一个关联数组。 散列具有键值对的条目,以便您可以通过提供其键来访问散列的值。 哈希文字也可以像列表一样指定,除了每个奇数条目都是一个键,每个偶数都是一个值。 您还可以使用=>
字符而不是逗号来分隔键和值。 (即, my %ordinals = ("one" => "first", "two" => "second");
) 通常,当您将数组或哈希值传递给子例程调用时,各个列表将被展平为一个长列表。 这有时是可取的,有时不是。 在后一种情况下,您可以使用引用将对整个列表的引用作为单个标量参数传递。 但是,引用的语法和语义很棘手,并且超出了本答案的范围。 但是,如果您想查看它,请参阅perlref
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.