Perl算法专题引用标量上下文列

Perl算法专题——引用、标量上下文、列表上下文

引用

引用的功能在Perl6中重要性更明确了。在引用与普通变量之间有一个很小的区别,并且在自动处理引用或解除引用的某些必要时才会被使用到。创造一个数组或哈希的引用并不需要什么特别语法,你只需要简单的把他们赋给一个变量就可以了:$arrayref=

array;$hashref=%hash;

在很多上下文关系里引用将会偷偷的被接触,所以使用数组索引或哈希的“键”来访问他们的数值你只需要这样明白的做:

$arrayref[1]$hashref{"Zaphod"}

在数组引用或哈希引用中调用方法就象一直在操作哈希和数组一样。指出“引用后面的数据类型或对象”测试在这个特别的引用中哪个方法可以使用,那些方法做什么了,无论如何引用可以支持这种连接的访问:$arrayref.elems$hashref.keys

通过引用可以很容易的执行带有参数的子程序。当然参数可以是空的,但是括号是必须有的:$subref($arg);

数组引用与哈希引用有个特别语法(

{...}和%{...})可以在上下文中解除他们的引用:

array=

{$arrayref};#or

array=

$arrayref;

通常一个数组引用如果赋给了另外一个数组将会产生只有这个单一数组引用的新数组。如果你想把所有的$arrayref内容都给到

array你必须先解除这个引用。

变量与上下文

在:$、

、%印记开头的变量上下文有一个明显的区别。$开头使用标量上下文,

开头使用列表上下文,%开头使用哈希上下文[1]。

[1]Perl6里不仅仅只有这三种上下文。一个更为详细的讨论请参看”骆驼与英文的本质第二版4.2.7部分或以后的章节”。

标量上下文

任何一个数组或列表被标量上下文求值将得到一个数组引用。这里有一个数组来说明这句话的含义:

array=("Zaphod","Ford","Trillian");$arrayref=

array;

一个列表:

$arrayref=("Zaphod","Ford","Trillian");

或是一个外部的匿名引用:

$arrayref=["Zaphod","Ford","Trillian"];

在上面的这个标量变量将正确的输出相同的结构:一个数组引用也会有三个元素。

列表的结构符逗号的功能在这个标量上下文当中有同样的效果。小括号只表示一小群。当一个单独的元素被放在小括号内并且赋给了一个标量上下文,它将成为典型的标量值:

$value=(20);

如果你想建立一个只有一个元素的数组索引,使用方括号([...])来创造一个匿名数组的引用:

$arrayref=[20];

一个看起来象哈希的内容被赋给了一个标量变量,这样它就产生了一个排列整齐的对儿数组,下面这种方法就是:

$pair_list=("Zaphod"=,"Ford"=,"Trillian"=28);

如果要使用哈希引用在标量上下文中,你必须使用{...}明确的表示出来这个结构:

$hashref={"Zaphod"=,"Ford"=,"Trillian"=28};

列表上下文

变量使用

作为印记将产生”平整列表”上下文。这个意思是如果你赋一个数组给另外一个数组,那么这些元素会很顺利的从原来的数组一个一个的复制到新数组中。这个结果就是两个不同结构的数组将包含有一样的值:

copy=

original;

一个列表同样也使用平整列表上下文。把一个数组赋给一个平整的列表并且把数组中每个元素按照前后顺序给到列表。如果数组的元素比列表多,那么多余的部分将自动被抛弃:

($first,$second,$third)=

array;

在列表上下文中如果有一个单独值,那么它将产生一个单独元素的数组:

array=(20);

array=20;#same

当匿名数组引用使用[...]构造器并且内部存放平整列表作为内容时。它将不能被处理成为列表上下文,这是因为平整列表上下文不能平整引用。在标量上下文中,一个普通的列表与一个数组引用结构可以产生一样的结果。但是在列表上下文中,一个(...)构造的列表可以作为一个平整列表对待,可[...]这种只能作为列表单一元素对待,这个元素是一个引用它可以引用到[...]中:

array=("Zaphod","Ford","Trillian");

array=["Zaphod","Ford","Trillian"];

上面第一个例子会产生有三个元素的数组。上面第二个例子会产生有一个元素的数组并且这个元素是引用了另外一个有三个元素的数组。这对于创造一个复杂的数据结构来说很有用处。

array=("Marvin",["Zaphod","Ford","Trillian"],"Zarniwoop");

同样的,在平整列表上下文中的一群数组变量列表可以平整成一个新的列表。一个标量变量列表也可以被处理成为新列表,即使这个标量变量列表中存储的是数组引用:

array=(

array1,

array2,

array3);#singleflattenedlist

array=($arrayref1,$arrayref1,$arrayref3);#3-elementlist

上面第一个例子产生一个包含他们三个数组所有元素的新数组,而第二个例子将产生包含他们三个引用的数组。

一个对独立的()表示将产生一个空列表。它将产生一个没有任何元素的数组结构,在标量里,和在列表上下文里均可:

$arrayref=();#0-elementarrayref

array=();#0-elementarray

哈希列表上下文

使用%印记的哈希列表上下文,期望得到对儿列表对象。这是一个典型的使用对儿构造器(=)创造的匿名对儿列表:

%hash=("Zaphod"=,"Ford"=,"Trillian"=28);

一个简单的值列表在哈希列表上下文中会被变为对儿列表。你可以在哈希列表中替代对儿书写那种方式:

%hash=("Zaphod",,"Ford",,"Trillian",28);

{...}用于构造匿名哈希引用,但是他们并不强制为哈希列表下上文。这是因为用{}包围一个普通结构并把它赋给一个标量,那它就是一个匿名子程序了:

#asubreferencethatreturnsalist$subref={"Zaphod",,"Ford",,"Trillian",28};

哈希引用构造器实际上不是{...}而是{...=...},所以当你把一个哈希引用赋给一个标量的时候你就不能使用逗号构造对儿结构。

我们用=来标记这个结构是一个哈希结构。如果存在歧义,你可以在上下文的右边强制指定块是哈希(hash)还是一个子程序(sub):

$subref=sub{print"Lostluggage.\n";}$hashref=hash{"Zaphod",,"Ford",,"Trillian",28};

喜欢我,







































白癜风医院杭州哪家好
哪里治白癜风



转载请注明:http://www.92nongye.com/xxmb/xxmb/204618884.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了