由于数组和哈希只能包含在Perl标量,你为什么要使用$来告诉解释该值是一个标访问数组或哈希的元素是什么时候? 换句话说,假设你有一个数组@myarray
和哈希%myhash
,为什么你需要做的:
$x = $myarray[1];
$y = $myhash{'foo'};
而不是仅仅做:
$x = myarray[1];
$y = myhash{'foo'};
为什么上面的暧昧?
那岂不是违法的Perl代码,如果它是什么,但在那个地方$? 例如,是不是所有的非法如下Perl中?
@var[0];
@var{'key'};
%var[0];
%var{'key'};
切片是不是非法的:
@slice = @myarray[1, 2, 5];
@slice = @myhash{qw/foo bar baz/};
我怀疑这就是为什么你需要指定,如果你想获得一个值出来的哈希/阵列或没有的部分原因。
我只是用
my $x = myarray[1];
在程序中,令我惊讶的是,这里发生了什么事,当我跑它:
$ perl foo.pl
Flying Butt Monkeys!
这是因为整个程序是这样的:
$ cat foo.pl
#!/usr/bin/env perl
use strict;
use warnings;
sub myarray {
print "Flying Butt Monkeys!\n";
}
my $x = myarray[1];
所以myArray的调用子程序传递一个参考含有单个元件,1匿名数组。
这就是你需要在一个数组访问的印记另一个原因。
该印记给你容器的返回类型。 所以,如果有事情和启动@
,你知道,它返回一个列表。 如果它开始$
,它返回一个标量。
现在,如果仅存在印记后的标识符(如$foo
或@foo
,那么它是一个简单的变量访问。如果它后面是[
,它是在阵列上的访问时,如果它的后面是{
,这是一个访问一个散列。
# variables
$foo
@foo
# accesses
$stuff{blubb} # accesses %stuff, returns a scalar
@stuff{@list} # accesses %stuff, returns an array
$stuff[blubb] # accesses @stuff, returns a scalar
# (and calls the blubb() function)
@stuff[blubb] # accesses @stuff, returns an array
一些人类语言有非常相似的概念。
然而,许多程序员发现,混乱,所以Perl 6用不变的印记。
一般来说Perl的5编译器想知道,在编译时,如果事情是在列表或者在标量上下文,所以没有领先的印记一些条款会变得模糊。
这是有效的Perl: @var[0]
它是一个长度的阵列切片。 @var[0,1]
是长度为两个的阵列切片。
@var['key']
是无效的Perl因为阵列可以仅通过数字进行索引,而另两个( %var[0] and %var['key']
不是有效的Perl因为散列片段使用{}索引散列。
@var{'key'}
和@var{0}
都是有效的散片,虽然。 显然,这是不正常的采取长一个切片,但它肯定是有效的。
见perldata的perldoc的分割部分约在Perl切片的更多信息。
人们已经指出,你可以切片和背景,但印记在那里是从其他一切变量的东西分开。 你不必知道所有的关键字或子程序的名称来选择一个合理的变量名。 这是大事情我在其他语言想念Perl的一个。
我能想到的一种方式
$x = myarray[1];
是模糊的 - 如果你想要一个称为M阵列?
$x = m[1];
你如何区分正则表达式匹配,除了?
换句话说,语法是有帮助的Perl解释器,以及,解释!
Perl 5中(在Perl 6被改变)一个印记表示表达式的情况下 。
- 你想要一个特定的标出来的哈希,因此它的
$hash{key}
。 - 你想要一个特定插槽出阵列的价值,所以它的
$array[0]
然而,正如zigdon指出, 切片是合法的。 他们解释在列表环境中的表现。
- 你想1个值的列表中的哈希
@hash{key}
作品 而且更大的工作清单,以及像@hash{qw<key1 key2 ... key_n>}
你想一对夫妇插槽出数组@array[0,3,5..7,$n..$n+5]
作品
-
@array[0]
是大小为1的列表。
没有“哈希语境”,所以既不%hash{@keys}
也不%hash{key}
具有意义。
所以,你必须"@"
+ "array[0]"
<=> <印记=上下文> + <索引表达>作为完整表达。
在Perl 5您需要的印记($ @和),因为裸字标识的默认解释是,子程序调用的(因此无需使用与在大多数情况下)。