为什么在Perl访问数组和散列元素时,你需要$?(Why do you need $ when ac

2019-07-21 10:25发布

由于数组和哈希只能包含在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'};

Answer 1:

切片是不是非法的:

@slice = @myarray[1, 2, 5];
@slice = @myhash{qw/foo bar baz/};

我怀疑这就是为什么你需要指定,如果你想获得一个值出来的哈希/阵列或没有的部分原因。



Answer 2:

我只是用

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匿名数组。

这就是你需要在一个数组访问的印记另一个原因。



Answer 3:

该印记给你容器的返回类型。 所以,如果有事情和启动@ ,你知道,它返回一个列表。 如果它开始$ ,它返回一个标量。

现在,如果仅存在印记后的标识符(如$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编译器想知道,在编译时,如果事情是在列表或者在标量上下文,所以没有领先的印记一些条款会变得模糊。



Answer 4:

这是有效的Perl: @var[0] 它是一个长度的阵列切片。 @var[0,1]是长度为两个的阵列切片。

@var['key']是无效的Perl因为阵列可以仅通过数字进行索引,而另两个( %var[0] and %var['key']不是有效的Perl因为散列片段使用{}索引散列。

@var{'key'}@var{0}都是有效的散片,虽然。 显然,这是不正常的采取长一个切片,但它肯定是有效的。

见perldata的perldoc的分割部分约在Perl切片的更多信息。



Answer 5:

人们已经指出,你可以切片和背景,但印记在那里是从其他一切变量的东西分开。 你不必知道所有的关键字或子程序的名称来选择一个合理的变量名。 这是大事情我在其他语言想念Perl的一个。



Answer 6:

我能想到的一种方式

$x = myarray[1];

是模糊的 - 如果你想要一个称为M阵列?

$x = m[1];

你如何区分正则表达式匹配,除了?

换句话说,语法是有帮助的Perl解释器,以及,解释!



Answer 7:

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]" <=> <印记=上下文> + <索引表达>作为完整表达。



Answer 8:

该印记提供了访问上下文:

  • $表示标量上下文(标量变量或散列或阵列的单个元件)
  • @意味着列表上下文(整个阵列或散列或阵列的切片)
  • %是一个完整的散列


Answer 9:

在Perl 5您需要的印记($ @和),因为裸字标识的默认解释是,子程序调用的(因此无需使用与在大多数情况下)。



文章来源: Why do you need $ when accessing array and hash elements in Perl?