Chinaunix首页 | 论坛 | 博客
  • 博客访问: 485003
  • 博文数量: 142
  • 博客积分: 4126
  • 博客等级: 上校
  • 技术积分: 1545
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-22 10:03
文章分类

全部博文(142)

文章存档

2011年(8)

2010年(7)

2009年(64)

2008年(63)

我的朋友

分类:

2009-06-02 15:50:26

Perl中的变量有三种:标量,数组,以及Hash表.

标量可以存放的数据类型有很多,除了常用的字符串和数字外,还可以存放引用, 而引用则可以是任何类型数据的引用.
比如:
@array = (1, 2, 3);
$ref = \@array; #创建一个对数组array的引用
注意引用的使用方法是, 在所引用的对象前面加上\,而在解引用的时候需要记住的是引用是一个标量,所以$ref表示的是一个引用, 要继续解释该引用所引用的数据还需要根据引用的数据类型进一步加以解释,比如:
如果标量$ref引用的是一个数组, 那么: $ref->[0], 或者$$ref[0], 或者$($ref)[0], 都是取得该数组的第一个元素.
如果标量$ref引用的是一个Hash表, 那么: $ref->{key}, 或者$$ref{key}, 或者$($ref){key}, 都是取得该Hash表中键为key的value.
如果标量$ref引用的是一个函数, 那么: &$ref, 或者&($ref), 都是取得对该函数的调用.
为 了方便理解记忆Perl中的引用使用方法,可以把$ref理解为所引用之物的名字, 比如$$ref[0]中, 将$ref理解为array, 那么$$ref[0]可以解释为$array[0].或者, 用C中指针的方式来理解Perl中引用->符号的使用, 将$ref理解为一个"指针", 而在->右边, 需要根据所引用的类型进行解释, 比如数组就是[], Hash表就是{}, 等等.

列表与数组
<>(小骆驼)中介绍数组的那一章开始部分说的很明白:列表是数据的序列, 而数组是变量.比如:
@array = (1,2,3);
array是一个数组, 它是一个变量;而(1,2,3)则是一个列表, 它是由标量1,2,3组成.

Hash
Hash表在赋值的时候常采用如下的方式:
%hash = (key=>value);
在 Perl中, 使用一个列表对Hash进行赋值, 分别是key1 value1 key2 value2...依次类推, 也就是说, 当采用一个列表对Hash进行赋值操作的时候, 键/值是交替出现的, 而在Perl中"=>"和","的意义是一样的, 放在对Hash进行赋值的列表中, 增加了代码的可读性.
同时注意到, 在Perl中, Hash的键都是字符串, 但是在{}之中的的键可以不加""或者''号, 比如$hash{key}, $hash{"key"}, $hash{'key'}都是一个意思.

在Perl中, 如果仅需要取得一个数据的时候, 需要采用$符号.标量自不必解释, 对数组而言, $array[0]是取得第一个数组元素, 而对Hash而言, $Hash{key}是取得键为key的值.
而 要取得数组或者Hash中的部分元素时,使用@符号, 如@array[0,1]返回数组array中的第一和第二个元素组成的列表, @hash{key1, key2}返回hash中键为key1, key2的值组成的列表.注意没有%hash{key1}这样的语法, 如果要取得所有的数组,使用@array;如果要取得全部Hash中的元素, 包括key和value,则使用%hash.

变量的内插(Interpolating)
当把一个数组变量在""中内插的时候, 则将该数组中的各个元素用变量$"(通常是空格)分隔开组合成一个字符串, 因此:
$temp = join( $", @ARGV );
print $temp;

print "@ARGV";
的意义是一样的.
而如果一个数组不放在""中进行内插的话, 仅仅返回这个数组的所有元素组成的列表,如:
@array = (1,2,3);
print @array;
得到的是:123(注意123之间没有空格分隔).

不存在对整个Hash的内插, 比如变量hash是一个Hash表, 那么:
print "%hash";
仅仅打印出%hash, 它并没有针对该Hash进行内插.
变量内插仅仅针对$和@作用的变量.
阅读(721) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~