perl基本语法.doc_第1页
perl基本语法.doc_第2页
perl基本语法.doc_第3页
perl基本语法.doc_第4页
perl基本语法.doc_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Perl6基本语法原文地址:/noncgi/usr/affix/050414113824_7_perl.html Perl6正在迅速的发展,所以语法也会总有变化。在下文中的部分语法可能在你看这篇文章的时候已经过时。虽然如此,我们还有一些基本的资料可以查看。如果你继续看以下的内容以后你只需要花费极少数的时间用来看改变情况(查看开发文档 Perl6启示录12以后的内容.译者注:查看Perl6大纲也是非常好的决定很可惜的是现在还没有完成中文,Perlchina的Fayland和台北推广组兄弟们正在努力中文版)。 从现在开始装的傻B一下,告诉你自己其实你一点也不懂Perl。你隐约记得Perl有一些特别,所以你想证实你的想法。你考虑到Larry Wall可以解释你的疑虑,所以你来到书店买了一本”Perl语言编程”。这是最新版的书讲述了6.0.1版。它并未描述Perl6有那些新功能,而是从入门开始讲解,于是你开始为你的好奇心猛啃这本书,就象小孩在生日上得到他想要已久的望远镜。现在,这篇文章就是让你看到未来的望远镜。 在本章的以后时间里我们将分析Perl6的各种特色并且来评价那些是你喜欢的那些是你不喜欢的。好!现在开始暂退一步,放掉那些细节,我们从整体上开始讲。 变量 o 标量(Scalar) o 数组(Array) o 对儿(Pair) o 哈希(Hash) o 引用(References) o 变量与上下文 标量上下文 列表上下文 哈希列表上下文 o 道具与特性 o 类型 操作符 o 赋值与捆绑 o 算术操作符 o 字符串操作符 o 列表操作符 o 比较操作符 o 逻辑操作符 o 上下文强制符 o 位操作符 o 条件操作符 o 超连符 o 连接符 o 聪明匹配 标量匹配 列表匹配 数组匹配 哈希匹配 连接匹配 对象匹配 子程序匹配 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 = Perlchina = 362, Perl中文化 = 1574, 奖励 = 28 ;$subref = sub print $string ;$object = Android.new;一个文件句柄也仅仅是一个普通标量模式的普通对象:$filehandle = open $filename;数组数组变量存储简单的一排标量数值。通过数组的数字索引可以得到这些变量。0表示第一个值。符号是变量名字的一部分无论变量怎么使用都不会被取下来:crew = ( Perlchina, Perl中文化, 奖励 );$second_member = crew1; # Perl中文化获得一个数组有多少个元素你可以使用.elems方法。.last方法用来返回这个数组最后一个序列是哪个。$count_elements = crew.elems;$last_index = crew.last;对儿对儿(Pairs)存储了单一的键/值。他们没有一个独立的印记,因为他们很少情况被使用,所以他们可以被存储在标量、数组、哈希中。对儿的结构使用=来创造,”左面是键”=“左面是值”。$pair = key = value;改变选择语法也可以用来创造一个对儿,在一个冒号的后面填写“键”在括号的里面填写“值”:$pair = :key(value);这个选择语法是在子程序调用中经常使用的语法,你可以查看”骆驼与鹦鹉的本质第二版本”(Perl6 and Parrot Essentials,2nd Edition)的第五章5.3.1。哈希哈希中存放的是无序的标量值,使用”键”进行索引存储与调用。你可以轻松的产生一个哈希列表并存储匿名的对儿:%hash = ( Zaphod = 362, Ford = 1574, Trillian = 28 );每个”键”用来识别一个值,他们可以是字符串或对象,虽然对象”键”可能受到一些功能限制。为了性能”对象键”必须被声明才能使用。任何对象成为哈希结构的”键”必须有一个.id的方法,这个方法将一对一的返回对象实例的”值”这样可以避免哈希中冲突。这个方法在所有的基类中是默认的,所以你定义自己的.id方法时只需要担心唯一性就够了。$age = %hashZaphod; # 字符串$age = %hash$name; # 字符串变量$age = %hash$person; # 对象在文字字符串键旁边必须要有引号,而当你调用一个子程序来获得一个键时,这个子程序名不用像字符串键一样(必须去掉引号):$age = %hashget_key; # subroutine call如果你特讨厌输入引号,可以在键旁用自动引用符(双尖括号)来代替常用引用符(波浪号):$age = %hashZaphod; # string$age = %hash; # ASCII equivalent在列表上下文中,一个哈希会返回一列有键/值的对儿(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;在很多上下文关系里引用将会偷偷的被接触,所以使用数组索引或哈希的“键”来访问他们的数值你只需要这样明白的做:$arrayref1$hashrefZaphod在数组引用或哈希引用中调用方法就象一直在操作哈希和数组一样。指出“引用后面的数据类型或对象”测试在这个特别的引用中哪个方法可以使用,那些方法做什么了,无论如何引用可以支持这种连接的访问:$arrayref.elems$hashref.keys通过引用可以很容易的执行带有参数的子程序。当然参数可以是空的,但是括号是必须有的:$subref($arg);数组引用与哈希引用有个特别语法 ( . . . 和 % . . . ) 可以在上下文中解除他们的引用:array = $arrayref;# orarray = $arrayref;通常一个数组引用如果赋给了另外一个数组将会产生只有这个单一数组引用的新数组。如果你想把所有的$arrayref内容都给到array你必须先解除这个引用。变量与上下文在:$、%印记开头的变量上下文有一个明显的区别。$开头使用标量上下文,开头使用列表上下文,%开头使用哈希上下文1。1Perl6里不仅仅只有这三种上下文。一个更为详细的讨论请参看”骆驼与英文的本质第二版4.2.7部分或以后的章节”。 标量上下文任何一个数组或列表被标量上下文求值将得到一个数组引用。这里有一个数组来说明这句话的含义:array = ( Zaphod, Ford, Trillian );$arrayref = array;一个列表:$arrayref = ( Zaphod, Ford, Trillian );或是一个外部的匿名引用:$arrayref = Zaphod, Ford, Trillian ;在上面的这个标量变量将正确的输出相同的结构:一个数组引用也会有三个元素。列表的结构符逗号的功能在这个标量上下文当中有同样的效果。小括号只表示一小群。当一个单独的元素被放在小括号内并且赋给了一个标量上下文,它将成为典型的标量值:$value = (20);如果你想建立一个只有一个元素的数组索引,使用方括号( . . . ) 来创造一个匿名数组的引用:$arrayref = 20;一个看起来象哈希的内容被赋给了一个标量变量,这样它就产生了一个排列整齐的对儿数组,下面这种方法就是:$pair_list = ( Zaphod = 362, Ford = 1574, Trillian = 28 );如果要使用哈希引用在标量上下文中,你必须使用.明确的表示出来这个结构:$hashref = Zaphod = 362, Ford = 1574, 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 ); # single flattened listarray = ( $arrayref1, $arrayref1, $arrayref3 ); # 3-element list上面第一个例子产生一个包含他们三个数组所有元素的新数组,而第二个例子将产生包含他们三个引用的数组。一个对独立的()表示将产生一个空列表。它将产生一个没有任何元素的数组结构,在标量里,和在列表上下文里均可:$arrayref = ( ); # 0-element arrayrefarray = ( ); # 0-element array哈希列表上下文使用%印记的哈希列表上下文,期望得到对儿列表对象。这是一个典型的使用对儿构造器(=)创造的匿名对儿列表:%hash = ( Zaphod = 362, Ford = 1574, Trillian = 28 );一个简单的值列表在哈希列表上下文中会被变为对儿列表。你可以在哈希列表中替代对儿书写那种方式:%hash = ( Zaphod, 362, Ford, 1574, Trillian, 28 ); . . . 用于构造匿名哈希引用,但是他们并不强制为哈希列表下上文。这是因为用 包围一个普通结构并把它赋给一个标量,那它就是一个匿名子程序了:# a sub reference that returns a list$subref = Zaphod, 362, Ford, 1574, Trillian, 28 ;哈希引用构造器实际上不是.而是.=.,所以当你把一个哈希引用赋给一个标量的时候你就不能使用逗号构造对儿结构。我们用=来标记这个结构是一个哈希结构。如果存在歧义,你可以在上下文的右边强制指定块是哈希(hash)还是一个子程序(sub):$subref = sub print Lost luggage.n; $hashref = hash Zaphod, 362, Ford, 1574, Trillian, 28 ;道具与特性道具允许将说明补充到变量或值上。如同Damian需要解释一样,工具很象纸贴。你可以写一些注释,或是干脆把需要的信息乱写上去。之后就把它贴冰箱上,或是显示器,或是你汽车仪表盘上。当你不需要的时候就把它拿下来丢掉就可以了。一些道具是在编译时才被贴上的。他们被称做特性。特性仍然属于道具,只是他有一些特别点而已。特性在变量声明的时候就会被固定在变量上,并且以后也无法修改。编译时特性设置使用 is 关键字:my $pi is constant = 3.14159;constant 特性指定这个变量的值不可以被改变。其他特性被加载在运行时。他们只修改变量的值而不是变量。他们可以被增加或删除在代码执行的任何阶段。运行时工具使用 but 关键字:$true_value = 0 but true;true 道具指定这个值如果是在布尔(Boolean)上下文的时候将成为true,将不考虑真实值是什么。这个道具的特性含义是Perl6系统的呼叫将被一个简单的条件式检查。这个变量仍然返回数字值(成功的时候是0失败的时候其他数字值),但是它的值标记将在呼叫成功后返回成功或失败。道具和特性同样也可以存储值。在constant和ture被设置的时候定义他们自己的值。一些道具存储值参数:my array is dim(2,5,42); # specify dimensions你绝对不会相信道具有那么重要,并且还有更广阔的语法。你将在以后很多章节中看看到他的影子。道具不仅仅是对变量与值的设置,实际上他可以被设置在子程序、函数、类、词法、分析器并且存在参数列表中。类型Perl6允许你指定变量的类型与值的功能要比Perl5强,但是请注意您并不一定需要指定他们。如果你使用他们你将获得一些性能上的好处与语言之间的接口。类型系统还未全部完成,但是基础已经完成。Perl6在值类型与变量类型之间有一点小小区别。值 类型指定这个这个值所在的变量可以存储那种值。将一个 Int 值类型赋给一个标量后这个标量将只能存储整型值:my Int $scalar;将一个 Int 数值类型赋给一个数组后这个数组将只存储整型值:my Int array;同样,将一个 Int 值类型赋给一个哈希这个哈希也将只存储整型值(但是不设置 键 的类型):my Int %hash;变量 类型指定这个变量是什么容器。这个看起来基本上跟Perl5里的 tie 差不多。变量类型定义跟特性一样,使用 is 关键字。这个标记将暗示变量的类习惯内,如果要设置无类型的变量只需要这样:my $scalar is Scalar;my array is Array;my %hash is Hash;你同样可以定义你自己的类来实现变量类型:my $scalar is FileHandle;my array is Matrix;my %hash is BerkeleyDB;分级数据结构可以使用一个综合值类型。一个哈希存储整型数组,数组将只包含值类型 Array of Int:my Array of Int %hash;类型语法是可以改变的,你同样也可以这么写:my %hash is Hash of Array of Int;# ormy %hash of Array of Int;获得设置数据结构,这样将改进可读性,特别是在多级数据结构里:my Array of Hash of Array of Int %hash;my %hash is Hash of Array of Hash of Array of Int;操作符操作符为值的操作提供了一条捷径,它用几个字符就可以完成一个函数或多个函数才能做到的事情。从乐观角度讲操作符提供了不可思议的方便,当然从相反角度来看操作符由于在一个很小的地方就包含非常做的含义所以学习起来要困难一些。许多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 = The quick brown $fox jumps_over( ) the lazy $dog;$line = Belgium; # 追加到$line的结尾X操作符(x)可以重复字符串。他将反复的返回字符串不管操作符左面是一个单元素的变量还是一个列表。下面的实例赋值LintillaLintillaLintilla:$triplet = Lintilla x 3;相应的x=操作符重复原字符串并且返回给原变量:$twin = Lintilla;$twin x= 2; # LintillaLintilla列表操作符XX操作符(xx)用来重复列表。它将返回一个列表而不管左面是一个列表还是一个单元素。下面的这个实例赋值了有三个元素的数组array,其中每个元素都是Lintilla:array = Lintilla xx 3; # (Lintilla, Lintilla, Lintilla)相应的xx=将产生有指定数量元素的列表,并且将其赋给一个数组变量:array = (4, 2);array xx= 2; # 成为了 (4, 2, 4, 2)array = (array, array); # 等价范围操作符(.)返回一个值的列表,但是你要指定开始点和结束点:range = 3.7; # 3,4,5,6,7范围操作符是惰性的,所以一个包含无穷值的范围将不会一次计算所有的数在赋值前。相反他将返回一个列表发生器,只有在你需要的时候才返回你需要的元素。range = 3.Inf; # 惰性省略号操作符(.)同.Inf是一样的:range = 3 . . . ;比较操作符每个比较操作符都有两个样子,一个是数字比较另一个是字符串比较。比较操作符有大于(,gt),小于(=,ge),小于等于(=,le),等于(=,eq),不等于(!=,ne)。身份操作符(=:=)用来测试两个参数是否相同对象的别名。如果表达式为真将返回真如果为假将返回假。标准操作符(,cmp)在两个参数相同的情况下返回0,如果第一个大返回1,如果第二个大-1:if ($age 12) . . . 比较操作符允许被连接在一起。被连接在一起的比较操作符在执行的时候每个只执行一次:if (24 $age 42) . . . # 24 $age and $age 42逻辑操作符二元逻辑操作符根据条件的真实性测试两个值,然后返回其中一个或另外一个。他们也被认为是缩短(short-circuit)操作符,这是因为总的真实性可以由左侧来确定的话,右侧的就不会被运算。这样以来他就可以有条件的赋值和执行代码了。关系操作符与(AND)用&和低优先级的and来表示。如果左侧运算结果为假,那么就返回他的值。如果左侧运算结果为真,那右侧就被运算并返回它的值:$splat = $whale & $petunia;$splat = ($whale and $petunia);关系操作符或(OR)用|和低优先级的or来表示。当左侧为真时返回左侧值,否则运算右侧返回右侧值:$splat = $whale | $petunia;$splat = ($whale or $petunia);一个不同的或(OR)关系是用来测试是否定义而不是真假。它使用/和低级的err作为操作符。如果左侧的值有定义就返回,否则运算右侧返回右侧的值:$splat = $whale / $petunia;$splat = ($whale err $petunia);关系异或(XOR)用操作符和低级的xor操作符表示。当任意一个操作数(aperand)为真时返回为真的操作码。如果两个都为真或都为假时返回假。xor与其他不同,他不是缩短操作符。因为他必须运算两个条件才能知道真假:$splat = $whale $petunia;$splat = ($whale xor $petunia);perl 6 当然也有不同的布尔逻辑操作符:?& (AND), ?| (OR), 和 ? (XOR)。它们返回的值都是真或假。 $whale = 42;$petunia = 24;$value = $whale | $petunia # $value is 42$truth = $whale ?| $petunia # $truth is 1上下文强制符上下文表达式指定了将要输出的值的类型。一个数组希望同时被赋多个值,所以列表上下文正巧被赋到数组上了。一个标量变量希望得到一个单一的值,所以正好一个标量上下文来了。Perl的表达式常常适合这些上下文,产生他们需要的值。上下文经证明是Perl5里非常有价值的工具,所以在Perl6中由为它的重要性增加了筹码。空上下文环境(void context)依然存在,标量上下文被细化到布尔(boolean),整型(integer),数字(numeric),字符串(string)和对象(object)上下文。列表上下文被细化到平整列表(flattening-list)上下文,不平整列表上下文,懒惰列表上下文,哈希列表上下文。空上下文不需要任何返回值。标量上下文需要单一值。如果一个合成值,返回它自己的引用。布尔上下文需要真或假。包括传统对真的定义0,undef空字符串代表假。也包括其他值所定义的真假true和false。整型上下文需要整型值。已经被处理成为数字的字符串和浮点数(floating-point)将被切掉多余的部分。数字上下文需要数字,不管是整型的还是浮点的。不管是不是十进制的,还是二进制,十六进制,八进制或其他什么类型。字符串上下文需要字符串,它将把所有经过它的信息统统格式化成为字符串。对象上下文需要对象或更多的特性,一个对象的引用。它同样需要一个详细类型的对象。列表上下文需要收集值。任何一个单值在列表上下文中都将成为这个列表上下文的一个元素。平整列表需要一个列表。从他们那里平整出数组或哈希。不平整列表上下文需要一个列表。邀请数组、哈希和其他组合值成为离散实。懒惰列表上下文需要一个列表。和不平整列表上下文很象,但是并不一次性的需要列表的所有元素。哈希列表上下文需要对儿列表。每个典型哈希上下文都是以对儿作为基础的。当一元上下文操作符不受其他的影响时将会强制一个特殊的上下文。通常,默认的上下文总是对的,但是有些时候你需要对他们做些少许的控制。一元操作符?和低优先级的等价符true强制布尔上下文。赋值一个标量给另外一个标量只是简单的利用标量上下文,所以$number的值只是简单的被复制。如果使用?操作符号,你可以强制赋真(true)给这个变量而不是$number的值。$value = $number;$truth = ?$number;一元操作符!和低优先级的等价符not同样也强制布尔上下文,但是他们会否定(给假值)值。他们常常被用在只有否定是可见的布尔上下文结构中。$untruth = !$number;一元操作符+强制数字上下文,并且-也强制数字上下文只不过它与+正好相反:$number = +$string;$negnum = -$string;一元操作符强制字符串上下文:$string = $number;你同样可以建立标量,列表,哈希上下文使用$(.),(.)和%(.)。位操作符Perl6拥有整型和字符串两种位操作符。整型操作符使用AND,OR和XOR关系符号同标准的数字符号+(一元上下文操作符)配合在一起。他们就是+&,+|和+(位否定)。在Perl6中无符号整型是默认的整型,所以这些结果同在Perl5中使用use integer是等价的:$number = 42 +& 18; # $number is 2$number = 42 +| 18; # $number is 58$number = 42 + 18; # $number is 56$number = + 42; # $number is -43数字位移操作符在右操作码利用位的编号移动左操作码的值,可以任意到左()。$number = 4 1; # $number is 2字符串位移操作符使用AND,OR和XOR的关系符号同标准的字符串符(这个符号同把字符串联起来的一元字符串上下文操作符一样)配合在一起。他们是&,|,。$string = jj & gg; # $string is bb$string = aa | bb; # $string is cc$string = GG *; # $string is mm每个二元位操作符都拥有一个和这些符号接近的赋值语法:+&=,+|=,+=,=,&=,|=和=。条件操作符三重操作符?:求它的第二个或第三个操作码,依赖条件是第一个操作码为真或是假。它基本上是一个if-then-else结构的符号表达式:$form = ($heads = = 2) ? Zaphod : ape-descended lifeform;超连符超连符(hyper operator)基本上是为列表而设计的。他们是标准的标量操作符的修改版。每个操作符都有超连版,甚至用户定义的。它们同标量版相比有相同的基本结构,但是他们明显使用的是字符用标记 和 2(还有文本模式的和+-;nums = + strings;连接符从最简单角度来理解,连接符只不过是AND,OR,XOR和NOT的值表达式的替代品。二元的连接符有&(AND),|(OR),(XOR)。NOT没有连接符,但是有函数,一会你就可以看到了。因此,当|存在两个表达式之间的时候,他是逻辑操作符。if ($value = = 1) | ($value = = 2) . . . |在两个值之间有相同的逻辑关系: if $value = = 1 | 2 . . . 事实上,上面两个实例将返回相同的结果:当$value为1或2的时候他们返回真,别的可能返回假。在相同的情况下,你知道这些就足够了。 但,连接符确是一个比他们要强大的多的好想法,一会你就学到了他的秘密。一个连接操作并不返回任何的单一值,他将返回一个包含操作码的组合值。这个返回值就属于连接符!他可以被使用在任何允许连接符的地方。 $junc = 1 | 2;if ($value = = $junc) . . . 在这里,$junc变量被用来存放1 | 2,并且与之前一个实例的效果完全相同。 连接符基本上只是被定义在元素之间的逻辑关系(无特定顺序)。当对任何连接符操作的时候都是对整体(这部分代码)的操作。表格4-1列出了四种连接符类型与其他操作符的关系。 表格4-1. 连接符功能操作符关系含义all&AND所有值为真操作将得到真any|OR最后一个值为真操作将得到真oneXOR只有一个值为真操作将得到真noneNOT所有值都为假操作将得到真 最最简单的实例就是通过布尔上下文去求连接符的值。这种操作方式将向计算机询问“他是真吗?”,如果所有值都为真那么all连接符也为真(所以他也是真):true( $a & $b )true( all($a,$b) )所以,$a和$b是真,这个结果也是真。使用any连接符,如果任意值为真那么结果就是真:true( $a | $b )true( any($a,$b) )所以,只要$a或则$b是真或都是真,结果就是真。使用one连接符,如果只有一个值为真结果就是真: true( $a $b )true( one($a,$b) )所以,只要$a或$b为真,结果就可以为真。但是如果他们都为真,或都不为真,结果就为假。 使用none连接符,当没有值为真的时候结果就是真,换句话说所有值都是假的情况下。 true( none($a,$b) )所以,如果$a和$b都是假,结果就得到了真。当算术操作符与连接符配合的时候在数组上使用会很象超连符。连接符将穿越数组所有的元素:$junc = any(1, 2);$junc += 5; # $junc is now any(6, 7)连接符可以合并简洁产生还有强大的逻辑比较功能。如果你想测试两个设置没有交集,你可以象这样做:if all($a, $b) = = none($c, $d) . . . 这个语法将测试all里所有的元素比较none里所有的元素。翻译成为普通的逻辑操作符就是:if ($a != $c) & ($a != $d) & ($b != $c) & ($b != $d) . . . 如果你想从连接符中得到返回平整列表值,使用.values方法:$junc = all(1, 2, 3); # create a junction$sums = $junc + 3; # add 3set = $sums.values( ); # (4, 5, 6)获得连接符的结构,使用.dump方法将返回字符串: $string = $sums.dump( ); # all(4,5,6)使用.pick方法将从all或one连接符获得一个值,并且以普通标量返回:$junc = any(1, 2, 3);$single = $junc.pick( ); # may be 1, 2, or 3all连接符,none连接符或one连接符如果有超过一个值的时候,.pick方法将返回undef(未定义,在一些严重错误级别的时候将产生异常)。聪明匹配二元操作符提供了两个值之间的聪明匹配(smart match)。如果匹配成功它将返回真,如果匹配失败他将返回假3。反向匹配!符进行相反的匹配:如果结果为假,那么它将返回真。聪明匹配的匹配模式是由匹配参数决定的。如果两个参数的类型不能在编译时就被决定,那么将在运行时决定。聪明匹配通常是平衡的,所以AB与BA将得到相同的结果。3这是理论上的。实际上,匹配可能返回更复杂的值。只有在纯粹的布尔上下文的时候才会只返回真和假。 标量匹配任意标量(或是一些代码,但是代码返回的结果是标量值)的匹配依靠一个一其等价的字符串。如果$string包含Ford下面的实例结果将返回真:$string Ford在标量里如果要匹配数字,那么就使用数字去匹配。下面这个实例将获得结果42,如果$number是42的话。 $number 42一个表达式的结果是42也会成真: ( (5 * 8) + 2 ) 42用一个未定义的值来匹配出一个标量是否定义。如果$value返回真说明他未定义,如果返回假说明他定义了。$value undef$value $undefined_value标量值依靠一定规则(正则)来进行模式匹配。如果towel在$string的任何地方被找到,那么将返回真:$string /towel/标量匹配一个替换模式,并且常识替换值内容。如果$string的值发生替换将返回真否返回假:$string s/weapon/towel/标量值匹配一个布尔将很简单的返回真或是假。下面这个实例将永远返回真,因为右面的布尔总是返回真4:4有些时候这个表达式似乎没什么用。当你对switch声明了解程度象聪明匹配一样的时候,兴许会让你更深的理解。更多的信息请查看以后内容。 $value (1 = = 1)右边的布尔值必须是真的布尔:布尔比较或操作得到的结果,否或真函数的返回值,或一个值被强迫使用布尔上下文的!或?转换。布尔值也必须出现在右面,因为它出现在左面的时候就是标量。列表匹配标量将顺序性的匹配比较列表当中的每个元素。在表达式-到-表达式的匹配模式中,如果其中一个元素匹配结果为真,那么匹配就为真。下面的表达式将得到真,如果$value同他们三个字符串相同:$value ( Zaphod, Ford, Trillian )这是一个缩短匹配:第一个匹配成功后它将停止继续。它将有相同的真值,就象连续的匹配了所有or一样:($value Zaphod) or ($value Ford) or ($value Trillian)一个聪明匹配的列表可以包含所有的元素:标量,规则(rules),布尔表达样式,数组,哈希,其他:$value ( Zaphod, 5, /petunias/ )一个列表聪明匹配同另外一个列表进行匹配。其中第一个列表的每个值将会同第二个列表对应的值分别匹配。如果全部匹配成功那么结果将得到真。下面的这个实例得到的结果是真,因为他们两个列表完全一样: ( Zaphod, Ford, Trillian ) ( Zaphod, Ford, Trillian )这两个列表不相同,尽管他们有一样的长度,有接近的元素进行匹配:( $zaphod, $ford, $trillian ) ( Zaphod, /Ford/, /T/ )这个列表-到列表的匹配同样是缩短的。如果第一个匹配失败它将停止,他们将得到相同的真值,因为他们使用了and连接起几个聪明匹配:($zaphod Zaphod) and ($ford /Ford/) and ($trillian /T/)数组匹配一个非数字的匹配表达式匹配数组时候将匹配值是否在这个数组中。如果值在数组中被找到将得到真的返回值。如果array中的内容是Zaphod,Ford和Trillian并$value中包含他们其中的一个,那么返回值也将是真:$value array一个整型值匹配数组,将检查数组对应这个值索引元素是否存在。下面这个实例如果array2存在将返回真:2 array一个整型匹配数组引用,同样也将检查索引的元素是否存在:2 Zaphod, Ford, Trillian 这个匹配将返回真,因为第三个元素的引用是真。如果使用*操作符(查看以后控制结构部分)平整后的数组去匹配,相当于拿一组标量值去匹配一样。所以,下面的实例将搜索数组中包含2的值,而不是数组的第二个元素:2 *array一个数组通过规则(正则)匹配一个表达式将会把数组中每个元素都拿出来匹配。只要其中有一个被匹配成功那么就返回真。如果Trillian,Milliways,million是数组array的元素,下面的匹配为真(不管其他的了):array /illi/两个数组要是在一起匹配,那么他们两个会把所有的元素都拿出来进行对应的:humans vogons这个匹配返回真,如果两个数组有相同的长度并且humans0匹配vogons0,humans1匹配vogons1,等等。哈希匹配哈系被标量匹配的时候将匹配hash第一个值是否为真(以标量作为键):$key %hash如果%hash$key存在,那么

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论