第一章 数据引用与匿名存储

来源:互联网 发布:mac betterzip 注册码 编辑:程序博客网 时间:2024/05/16 05:53

zjzc01:/root/perl# cat a1.pl
line[19]=hello;print$line[19]isline[19]\n”;

print “\@line is @line\n”;
zjzc01:/root/perl# perl a1.pl
$line[19] is hello
@line is hello

创建一个数组元素:

这样就创建了一个第20个元素:

你可以通过在已有的Perl变量名前添加”\” 来创建对它的引用,例如:

创建若干变量:

zjzc01:/root/perl# cat a2.pl

创建若干变量

$a = “mama mia”;
@array = (10,20,30);
%hash = (“laurel” => “hardy”, “nick” => “nora”);

现在创建对它们的引用

#
ra = \$ra;  ###ra 现在引用(“指向”) $a

$rarray = \@array;

$rhash = \%hash;

print “$ra is $ra\n”;

print “$rarray is $rarray\n”;

print “\rhash is rhash\n”;  
zjzc01:/root/perl# perl a2.pl
ra is REF(0xaac4d0)
$rarray is ARRAY(0xaac380)
hash is HASH(0xaac410)

引用本身就是一种标量变量:

间接访问:

间接访问(dereference)

在C语言中,如果p是一个指针,那么*p 就表示p所指向的值。在Perl中如果$r是一个引用,

那么$$r,@$r或%$r分别是根据$r所引用的数据类型(标量变量,数组,散列表)获取的相应的值。

根据所引用的数据类型来选择使用正确的前缀是关键。

如果r,使@r而不是%r$r.使用错误的前缀将导致运行时的严重错误

zjzc01:/root/perl# cat a3.pl
a+=2;print$aisa\n”;

ra=$a;ra+=2;print"$ra is $$ra\n”;
zjzc01:/root/perl# cat a3.pl
$a += 2;
print “\$a is $a\n”;

ra=$a;ra+=2;print"$ra is $$ra\n”;
zjzc01:/root/perl# perl a3.pl
$a is 2
$SCALAR(0x21c2308) is 4

对数组的引用:

你可以用三种方式使用普通数组:

1.将数组作为一个整体进行存取,使用记号@array.例如,你可以打印整个数组或向其中添加元素

2.使用记号array[i] 来存储数组中的单个元素

3.使用记号@array[index1,index2,….] 来分段(slice)存取数组中的元素

@array=(1,2,3);
print “\@array is @array\n”;
$array = \@array;
push (@array ,4,5);
print “\@array is @array\n”;

print “array[3]\n;print$array[3]\n”;

对散列表的引用:

对散列表的引用同样直接了当:

zjzc01:/root/perl# cat a5.pl
%hash=(“a”=>1,”b”=>2,”c=”=>3);
print %hash;
print “\n”;
$rhash = \%hash;

print $hash{“a”};

print $$rhash{“a”};

zjzc01:/root/perl# perl a5.pl
a1c=3b2
11zjzc01:/root/perl#

简明的箭头记号:

Perl 提供了另一种简单易读的用以存取数据和散列表元素的语法结构: “->[]”

记号。例如, 如果给出了数组的引用,你可以这样来获取数组中的第2个元素:

4zjzc01:/root/perl# cat a6.pl
@array=(1,4,7);
$rarray = \@array;

print rarray>[1];print\n;print$rarray[1];
zjzc01:/root/perl# perl a6.pl
4
4zjzc01:/root/perl#

以前的访问方式为 $$rarray[1],现在是$rarray->[1]

与数组类似,你可以通过使用->{}记号来存取散列表中的数据元素:

向子例程传递数组和散列表:

当你要向子例程中传递一个以上的数组或散列时,Perl 将会把它们合并到@_数据中供子例程使用。

唯一避免合并的方法就是传递数组或散列表的引用。下面是一个将一个数组中的元素与另一个数组中对应元素相加的例子:

数据元素累加:

zjzc01:/root/perl# cat a7.pl
@array1 = (1,2,3); @array2 =(4,5,6,7);

AddArrays (\@array1,\@array2); ##以引用方式传递数组

print “\@array1 is @array1\n”;
print “\@array2 is @array2\n”;

sub AddArrays
{
my (rarray1,rarray2) = @_;
len2=@rarray2; ###aray2 的长度

for (I=0;I <len2;I++){
rarray1>[I] += rarray2>[I];
}
}

zjzc01:/root/perl# perl a7.pl
@array1 is 5 7 9 7
@array2 is 4 5 6 7

匿名存储的引用:

到目前为止, 我们学习创建了对已存在的变量的引用,现在我们要学习对”匿名”数据结构的引用,

也就是那些没有同变量名关联的值。

创建匿名数组,需要使用方括号而不是圆括号:

$ra = []; ###创建一个空的匿名数组,并返回对它的引用

$ra = [1,”hello”]; ##创建一个经过初始化的匿名数组,并返回对它的引用:

匿名数组使用[];

数据元素解引用:
zjzc01:/root/perl# cat a8.pl
ra=[1,2,3,heelo];print$ra is @$ra\n”;

print “

ra[0]\n";print"
ra[1]\n”;
print “$$ra[2]\n”;
zjzc01:/root/perl#
zjzc01:/root/perl# perl a8.pl
$ARRAY(0x217ed48) is 1 2 3 heelo
1
2
3

匿名散列使用{}代替:

hash数组元素解引用:

zjzc01:/root/perl# cat a9.pl
rh = {}; ##创建一个空的散列并返回对它的引用rh = {“k1”,”v1”,”k2”,”v2”};##一个经过初始化的匿名散列

print “11111111\n”;
print %rh;print222222222\n;print$rh{‘k1’};
zjzc01:/root/perl# perl a9.pl
11111111
k2v2k1v1222222222
v1zjzc01:/root/perl#

这是一个普通的使用%前缀的散列表,它是有圆括号所包围的列表初始化:

zjzc01:/root/perl# cat a10.pl
%hash=(“flock” => “birds”,”pride” => “lions”);

print “$hash{‘flock’} is hash{‘flock’} \n”;  
zjzc01:/root/perl# perl a10.pl
hash{‘flock’} is birds

匿名散列表是一组大括号括起来的列表

该表达式的结果是一个标量变量,值为指向散列表的引用:

zjzc01:/root/perl# cat a11.pl
$rhash = {“flock” => “birds”,”pride” => “lions”};

print “$$rhash{‘flock’} is

rhash{'flock'}\n";
zjzc01:/root/perl# perl a11.pl
rhash{‘flock’} is birds

zjzc01:/root/perl# cat a12.pl
{
my a=helloworld;ra = $a;
};

print “$a is $a\n”;

print “$$ra is

ra\n"; 
zjzc01:/root/perl# perl a12.pl 
$a is
ra is hello world

my 操作符可以将一个变量置为私有变量(用Perl的航华就是,局部化).你也可以使用操作符”local”,

但是它们之间有一种微妙却十分重要的差异.

这样,raa的全局变量。$a通常在代码块的末尾被删除,

但是由于ra,a分配的内存并没有被释放

多重引用的间接访问:

$a = 10;

ra = \$a;  ###引用指向a的值

rra = \$ra;###指向引用a值的引用的引用

$rra= \$rra; ###引用的引用的引用……..

引用的查询:

ref 函数被用来查询标量变量是否包含一个引用,是的话,再判定所指向的是什么数据类型。

如果ref的参数包含的是数字或字符串,就返回false(这是一个布尔值,不是字符串),若是引用,

就会返回代表所指的数据类型的字符串:

zjzc01:/root/perl# cat a13.pl
a=10;ra = $a;

if (ref(a))print111111\n;;if(ref(ra)){print “22222\n”;};
zjzc01:/root/perl# perl a13.pl
22222

0 0