Perl中$this
,@that
和%those
之间有什么区别?
答案 0 :(得分:39)
Perl sigils的一个有用的助记符是:
Matt Trout在blog.fogus.me上写了一篇关于Perl sigils的精彩评论,我认为它很有用,所以粘贴在下面:
实际上,perl sigils并不表示变量类型 - 它们表示共轭 - $是'the',@是 'this',%是'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代码时会看到这个印记,告诉你你将要做什么 而不是你正在经营的,几乎。
诚然,在你习惯它之前,这确实令人困惑,但是一旦你习惯了它 它可以是一个非常有用的工具,用于在略读代码时吸收信息。
当然,你仍然完全有权讨厌它,但这是一个有趣的概念而且我 想象你可能更喜欢讨厌实际发生的事情而不是你的想法 继续:)
答案 1 :(得分:23)
$this
是一个标量值,它包含apple
@that
是一个值数组,它包含几个类似("apple", "orange", "pear")
%those
是值的哈希值,它包含像("apple" => "red", "orange" => "orange", "pear" => "yellow")
有关Perl变量类型的更多信息,请参阅perlintro。
答案 2 :(得分:8)
Perl的发明家是语言学家,他试图让Perl成为一种“自然语言”。
来自this post:
按号码,案例和字词顺序消除歧义
语言可以通过某些局部歧义消失的部分原因是其他歧义被各种机制所抑制。英语使用数字和单词顺序,在代词中用案例系统的痕迹:“男人看着男人,他们回头看着他。”在这句话中,对于向谁做的事情是完全清楚的。同样,Perl在其名词上有数字标记;也就是说,$ dog是一个狗,而@dog(可能)很多。 所以$和@有点像“this”和英语中的“这些”。 [强调补充]
答案 3 :(得分:8)
人们经常尝试将符号绑定到变量类型,但它们只是松散相关。这是我们在Learning Perl和Effective Perl Programming中非常努力的主题,因为当您理解这些符号时,理解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下,%
现在可以表示key/value slice或散列或数组:
%array[ @indices ]; # returns pairs of indices and elements
%hash{ @keys }; # returns pairs of key-values for those keys
答案 4 :(得分:4)
您可能希望查看perlintro
和perlsyn
文档,以便真正开始了解Perl(即阅读翻转手册)。 : - )
那说:
$this
是一个标量,可以存储数字(int或float),字符串或引用(见下文); @that
是一个数组,可以存储有序的标量列表(参见上文)。您可以使用push
或unshift
函数(请参阅perlfunc
)向数组添加标量,并且可以使用括号括起的以逗号分隔的标量文字或变量列表来创建数组文字(即my @array = ($a, $b, 6, "seven");
)%those
是一个哈希,它是一个关联数组。散列具有键值对的条目,以便您可以通过提供其键来访问散列的值。哈希文字也可以像列表一样指定,除了每个奇数条目都是一个键,每个偶数都是一个值。您还可以使用=>
字符而不是逗号来分隔键和值。 (即my %ordinals = ("one" => "first", "two" => "second");
)通常,当您将数组或哈希值传递给子例程调用时,各个列表将被展平为一个长列表。这有时是可取的,有时不是。在后一种情况下,您可以使用引用将对整个列表的引用作为单个标量参数传递。但是,引用的语法和语义很棘手,并且超出了本答案的范围。但是,如果您想查看它,请参阅perlref
。