perl基本语法文档格式.docx
《perl基本语法文档格式.docx》由会员分享,可在线阅读,更多相关《perl基本语法文档格式.docx(37页珍藏版)》请在冰点文库上搜索。
▪列表匹配
▪数组匹配
▪哈希匹配
▪连接匹配
▪对象匹配
▪子程序匹配
o引用(或不)
o压缩操作符
∙结构控制
o选择
▪IF声明
▪unless声明
▪switch声明
o循环
▪while循环
▪简单循环
▪for循环
▪破坏循环
o块
▪my,our,temp,let
▪特性的块
▪异常处理
∙加入Perl6的开发队伍
∙译者尾
变量
变量几乎是所有计算机语言的基础部分,它把数据块吸入到自己身上使用在周围的环境,在不同的场合中变化,并且突然出现在一些新的位置。
这个数据库块的值可能是:
字符串、数字、其他的,或是复杂的数据结构。
变量正好是找到这些数据的名字。
Perl6有三种变量模式他们是:
标量(Scalar),数组(Array),哈希(Hash)。
他们三个每种都在变量的名字前有一个印记(符号):
标量是$,数组是@,哈希是%。
这个印记从视觉上可以清楚的告诉使用者变量的举止行为。
其实,他们三种的差别非常小。
从本质上来讲每种变只是一个装数据的罐子,不管这个变量是一种集合还是单独的一个(看看下面的内容吧,你就明白为什么上面要这么说了)。
标量
标量是一个全能的罐子。
他们可以存储字符串、整数、浮点数与各种对象的引用。
举例:
$string="
欢迎参加perlchina的Perl中文化你可以得到奖励"
;
$int=42;
$float=3.14159;
$arrayref=["
Perlchina"
"
Perl中文化"
奖励"
];
$hashref={"
=>
362,"
1574,"
28};
$subref=sub{print$string};
$object=Android.new;
一个文件句柄也仅仅是一个普通标量模式的普通对象:
$filehandle=open$filename;
数组
数组变量存储简单的一排标量数值。
通过数组的数字索引可以得到这些变量。
0表示第一个值。
@符号是变量名字的一部分无论变量怎么使用@都不会被取下来:
@crew=("
);
$second_member=@crew[1];
#Perl中文化
获得一个数组有多少个元素你可以使用.elems方法。
.last方法用来返回这个数组最后一个序列是哪个。
$count_elements=@crew.elems;
$last_index=@crew.last;
对儿
对儿(Pairs)存储了单一的键/值。
他们没有一个独立的印记,因为他们很少情况被使用,所以他们可以被存储在标量、数组、哈希中。
对儿的结构使用=>
来创造,”左面是键”=>
“左面是值”。
$pair='
key'
'
value'
改变选择语法也可以用来创造一个对儿,在一个冒号的后面填写“键”在括号的里面填写“值”:
$pair=:
key('
);
这个选择语法是在子程序调用中经常使用的语法,你可以查看”骆驼与鹦鹉的本质第二版本”(Perl6andParrotEssentials,2ndEdition)的第五章5.3.1。
哈希
哈希中存放的是无序的标量值,使用”键”进行索引存储与调用。
你可以轻松的产生一个哈希列表并存储匿名的对儿:
%hash=("
Zaphod"
Ford"
Trillian"
28);
每个”键”用来识别一个值,他们可以是字符串或对象,虽然对象”键”可能受到一些功能限制。
为了性能”对象键”必须被声明才能使用。
任何对象成为哈希结构的”键”必须有一个.id的方法,这个方法将一对一的返回对象实例的”值”这样可以避免哈希中冲突。
这个方法在所有的基类中是默认的,所以你定义自己的.id方法时只需要担心唯一性就够了。
$age=%hash{"
};
#字符串$age=%hash{$name};
#字符串变量$age=%hash{$person};
#对象
在文字字符串键旁边必须要有引号,而当你调用一个子程序来获得一个键时,这个子程序名不用像字符串键一样(必须去掉引号):
$age=%hash{get_key};
#subroutinecall
如果你特讨厌输入引号,可以在键旁用自动引用符(双尖括号)来代替常用引用符(波浪号):
$age=%hash«
Zaphod»
#string$age=%hash<
<
Zaphod>
>
#ASCIIequivalent
在列表上下文中,一个哈希会返回一列有键/值的对儿(Pairs)对象。
而.kv方法会从哈希返回一个”平整列表”。
看把一个哈希直接给到一个数组:
译者注:
一般的当你把(“Perlchina”=>
“中文化”)变成(“Perlchina”,”中文化”)后者就属于平整列表,平整列表也是数组中存储数据的格式。
后文中这个单词还会出现。
@pairs=%hash;
看,产生了一个全是对儿的数组:
(pair1,pair2,pair3,etc...)
然而关系被变成平整列表:
@flat=%hash.kv;
就变成了这个样子:
(key1,value1,key2,value2,etc...)
.keys方法将返回在哈希中的所有“键”的列表。
.values方法将返回在哈希中的所有“值”:
@keys=%hash.keys;
@values=%hash.values;
引用
引用的功能在Perl6中重要性更明确了。
在引用与普通变量之间有一个很小的区别,并且在自动处理引用或解除引用的某些必要时才会被使用到。
创造一个数组或哈希的引用并不需要什么特别语法,你只需要简单的把他们赋给一个变量就可以了:
$arrayref=@array;
$hashref=%hash;
在很多上下文关系里引用将会偷偷的被接触,所以使用数组索引或哈希的“键”来访问他们的数值你只需要这样明白的做:
$arrayref[1]$hashref{"
}
在数组引用或哈希引用中调用方法就象一直在操作哈希和数组一样。
指出“引用后面的数据类型或对象”测试在这个特别的引用中哪个方法可以使用,那些方法做什么了,无论如何引用可以支持这种连接的访问:
$arrayref.elems$hashref.keys
通过引用可以很容易的执行带有参数的子程序。
当然参数可以是空的,但是括号是必须有的:
$subref($arg);
数组引用与哈希引用有个特别语法(@{...}和%{...})可以在上下文中解除他们的引用:
@array=@{$arrayref};
#or@array=@$arrayref;
通常一个数组引用如果赋给了另外一个数组将会产生只有这个单一数组引用的新数组。
如果你想把所有的$arrayref内容都给到@array你必须先解除这个引用。
变量与上下文
在:
$、@、%印记开头的变量上下文有一个明显的区别。
$开头使用标量上下文,@开头使用列表上下文,%开头使用哈希上下文[1]。
[1]Perl6里不仅仅只有这三种上下文。
一个更为详细的讨论请参看”骆驼与英文的本质第二版4.2.7部分或以后的章节”。
标量上下文
任何一个数组或列表被标量上下文求值将得到一个数组引用。
这里有一个数组来说明这句话的含义:
@array=("
一个列表:
$arrayref=("
或是一个外部的匿名引用:
在上面的这个标量变量将正确的输出相同的结构:
一个数组引用也会有三个元素。
列表的结构符逗号的功能在这个标量上下文当中有同样的效果。
小括号只表示一小群。
当一个单独的元素被放在小括号内并且赋给了一个标量上下文,它将成为典型的标量值:
$value=(20);
如果你想建立一个只有一个元素的数组索引,使用方括号([...])来创造一个匿名数组的引用:
$arrayref=[20];
一个看起来象哈希的内容被赋给了一个标量变量,这样它就产生了一个排列整齐的对儿数组,下面这种方法就是:
$pair_list=("
如果要使用哈希引用在标量上下文中,你必须使用{...}明确的表示出来这个结构:
列表上下文
变量使用@作为印记将产生”平整列表”上下文。
这个意思是如果你赋一个数组给另外一个数组,那么这些元素会很顺利的从原来的数组一个一个的复制到新数组中。
这个结果就是两个不同结构的数组将包含有一样的值:
@copy=@original;
一个列表同样也使用平整列表上下文。
把一个数组赋给一个平整的列表并且把数组中每个元素按照前后顺序给到列表。
如果数组的元素比列表多,那么多余的部分将自动被抛弃:
($first,$second,$third)=@array;
在列表上下文中如果有一个单独值,那么它将产生一个单独元素的数组:
@array=(20);
@array=20;
#same
当匿名数组引用使用[...]构造器并且内部存放平整列表作为内容时。
它将不能被处理成为列表上下文,这是因为平整列表上下文不能平整引用。
在标量上下文中,一个普通的列表与一个数组引用结构可以产生一样的结果。
但是在列表上下文中,一个(...)构造的列表可以作为一个平整列表对待,可[...]这种只能作为列表单一元素对待,这个元素是一个引用它可以引用到[...]中:
@array=["
上面第一个例子会产生有三个元素的数组。
上面第二个例子会产生有一个元素的数组并且这个元素是引用了另外一个有三个元素的数组。
这对于创造一个复杂的数据结构来说很有用处。
Marvin"
["
],"
Zarniwoop"
同样的,在平整列表上下文中的一群数组变量列表可以平整成一个新的列表。
一个标量变量列表也可以被处理成为新列表,即使这个标量变量列表中存储的是数组引用:
@array=(@array1,@array2,@array3);
#singleflattenedlist@array=($arrayref1,$arrayref1,$arrayref3);
#3-elementlist
上面第一个例子产生一个包含他们三个数组所有元素的新数组,而第二个例子将产生包含他们三个引用的数组。
一个对独立的()表示将产生一个空列表。
它将产生一个没有任何元素的数组结构,在标量里,和在列表上下文里均可:
$arrayref=();
#0-elementarrayref@array=();
#0-elementarray
哈希列表上下文
使用%印记的哈希列表上下文,期望得到对儿列表对象。
这是一个典型的使用对儿构造器(=>
)创造的匿名对儿列表:
一个简单的值列表在哈希列表上下文中会被变为对儿列表。
你可以在哈希列表中替代对儿书写那种方式:
362,"
1574,"
28);
{...}用于构造匿名哈希引用,但是他们并不强制为哈希列表下上文。
这是因为用{}包围一个普通结构并把它赋给一个标量,那它就是一个匿名子程序了:
#asubreferencethatreturnsalist$subref={"
28};
哈希引用构造器实际上不是{...}而是{...=>
...},所以当你把一个哈希引用赋给一个标量的时候你就不能使用逗号构造对儿结构。
。
我们用=>
来标记这个结构是一个哈希结构。
如果存在歧义,你可以在上下文的右边强制指定块是哈希(hash)还是一个子程序(sub):
$subref=sub{print"
Lostluggage.\n"
}$hashref=hash{"
道具与特性
道具允许将说明补充到变量或值上。
如同Damian需要解释一样,工具很象纸贴。
你可以写一些注释,或是干脆把需要的信息乱写上去。
之后就把它贴冰箱上,或是显示器,或是你汽车仪表盘上。
当你不需要的时候就把它拿下来丢掉就可以了。
一些道具是在编译时才被贴上的。
他们被称做特性。
特性仍然属于道具,只是他有一些特别点而已。
特性在变量声明的时候就会被固定在变量上,并且以后也无法修改。
编译时特性设置使用is关键字:
my$piisconstant=3.14159;
constant特性指定这个变量的值不可以被改变。
其他特性被加载在运行时。
他们只修改变量的值而不是变量。
他们可以被增加或删除在代码执行的任何阶段。
运行时工具使用but关键字:
$true_value=0buttrue;
true道具指定这个值如果是在布尔(Boolean)上下文的时候将成为true,将不考虑真实值是什么。
这个道具的特性含义是Perl6系统的呼叫将被一个简单的条件式检查。
这个变量仍然返回数字值(成功的时候是0失败的时候其他数字值),但是它的值标记将在呼叫成功后返回成功或失败。
道具和特性同样也可以存储值。
在constant和ture被设置的时候定义他们自己的值。
一些道具存储值参数:
my@arrayisdim(2,5,42);
#specifydimensions
你绝对不会相信道具有那么重要,并且还有更广阔的语法。
你将在以后很多章节中看看到他的影子。
道具不仅仅是对变量与值的设置,实际上他可以被设置在子程序、函数、类、词法、分析器并且存在参数列表中。
类型
Perl6允许你指定变量的类型与值的功能要比Perl5强,但是请注意您并不一定需要指定他们。
如果你使用他们你将获得一些性能上的好处与语言之间的接口。
类型系统还未全部完成,但是基础已经完成。
Perl6在值类型与变量类型之间有一点小小区别。
值类型指定这个这个值所在的变量可以存储那种值。
将一个Int值类型赋给一个标量后这个标量将只能存储整型值:
myInt$scalar;
将一个Int数值类型赋给一个数组后这个数组将只存储整型值:
myInt@array;
同样,将一个Int值类型赋给一个哈希这个哈希也将只存储整型值(但是不设置键的类型):
myInt%hash;
变量类型指定这个变量是什么容器。
这个看起来基本上跟Perl5里的tie差不多。
变量类型定义跟特性一样,使用is关键字。
这个标记将暗示变量的类习惯内,如果要设置无类型的变量只需要这样:
my$scalarisScalar;
my@arrayisArray;
my%hashisHash;
你同样可以定义你自己的类来实现变量类型:
my$scalarisFileHandle;
my@arrayisMatrix;
my%hashisBerkeleyDB;
分级数据结构可以使用一个综合值类型。
一个哈希存储整型数组,数组将只包含值类型ArrayofInt:
myArrayofInt%hash;
类型语法是可以改变的,你同样也可以这么写:
my%hashisHashofArrayofInt;
#ormy%hashofArrayofInt;
获得设置数据结构,这样将改进可读性,特别是在多级数据结构里:
myArrayofHashofArrayofInt%hash;
my%hashisHashofArrayofHashofArrayofInt;
操作符
操作符为值的操作提供了一条捷径,它用几个字符就可以完成一个函数或多个函数才能做到的事情。
从乐观角度讲操作符提供了不可思议的方便,当然从相反角度来看操作符由于在一个很小的地方就包含非常做的含义所以学习起来要困难一些。
许多Perl6的操作符都是大家熟知的,尤其是Perl5程序员们。
新的操作符部分也为语言本身增加了新功能,或是让Perl的操作符同系统更一致了。
赋值与捆绑
等于号(=)是最普通的操作符。
它把值从右面复制并且赋给右面的变量或某种数据结构:
$copy=$original;
@copies=@originals;
$copy和$original有相同的值;
@copies拥有@originals所有的元素。
冒号等于号(:
=)用来操作绑定赋值。
使用创建别名的方式代替从一个变量或结构复制到其他。
别名在符号表中表示对这个值容器的另外一个入口(译者注:
就象给你家开一个后门一样,屋子都是同样的内容)。
$a:
=$b;
#$a是$b的别名@c:
=@d;
#@c是@d别名
在这个实里例中如果你修改变量$a那么变量$b也会有变化,反之也是。
这是因为他们两个只是同一个容器的不同名字而已。
绑定赋值要求在两边有相同数量的元素否则就会出错:
#($a,$b):
=($c);
#错误#($a,$b):
=($c,$d,$e);
#错误
双冒号等于号(:
:
=)是一个不同的绑定操作符,它在程序编译时才被执行。
算术操作符
算术操作符有:
加法(+)、减法(-)、乘法(*)、除法(/)、系数(%)、求幕(**)。
他们每个都有相应的赋值符表达方式(+=、-=、*=、/=、%=、**=):
$a=3+5;
$a+=5;
#$a=$a+5
一元算术操作符使用前缀和后缀的自增(++)自减(--),前缀符在赋值前完成计算,后缀符与其相反。
$a++;
$a--;
++$a;
--$a;
字符串操作符
浪线(~)操作符用来连接字符串。
连接符(~=)将右边的字符串赋到左面的结尾:
$line="
Thequickbrown"
~$fox~jumps_over()~"
thelazy"
~$dog;
$line~="
Belgium"
#追加到$line的结尾
X操作符(x)可以重复字符串。
他将反复的返回字符串不管操作符左面是一个单元素的变量还是一个列表。
下面的实例赋值"
LintillaLintillaLintilla"
:
$triplet="
Lintilla"
x3;
相应的x=操作符重复原字符串并且返回给原变量:
$twin="
$twinx=2;
#"
LintillaLintilla"
列表操作符
XX操作符(xx)用来重复列表。
它将返回一个列表而不管左面是一个列表还是一个单元素。
下面的这个实例赋值了有三个元素的数组@array,其中每个元素都是"
@array="
xx3;
#("
)
相应的xx=将产生有指定数量元素的列表,并且将其赋给一个数组变量:
@array=(4,2);
@arrayxx=2;
#成为了(4,2,4,2)@array=(@array,@array);
#等价
范围操作符(..)返回一个值的列表,但是你要指定开始点和结束点:
@range=3..7;
#3,4,5,6,7
范围操作符是惰性的,所以一个包含无穷值的范围将不会一次计算所有的数在赋值前。
相反他将返回一个列表发生器,只有在你需要的时候才返回你需要的元素。
@range=3..Inf;
#惰性
省略号操作符(...)同..Inf是一样的:
@range=3...;
比较操作符
每个比较操作符都有两个样子,一个是数字比较另一个是字符串比较。
比较操作符有大于(>
,gt),小于(<
,lt),大于等于(>
=,ge),小于等于(<
=,le),等于(==,eq),不等于(!
=,ne)。
身份操作符(=:
=)用来测试两个参数是否相同对象的别名。
如果表达式为真将返回真如果为假将返回假。
标准操作符(<
=>
,cmp)在两个参数相同的情况下返回0,如果第一个大返回1,如果第二个大-1:
if($age>
12){...}
比较操作符允许被连接在一起。
被连接在一起的比