编程学习biancheng.45soft.com 本站提供了各种在线教程和资料,供大家学习与参考.
编程学习
当前位置: 主页 > Perl > 操作符 >

Perl 操作符


在上面一章里,我们讲了各种你可能在表达式里用到的项,不过老实说,把项隔离出来让人觉得有点无聊。因为许多项都是群居动物。它们相互之间有某种关系。年轻的项急于以各种方式表现自己并影响其它项,而且还存在不同类型的社会关系和许多不同层次的义务。在 Perl 里,这种关系是用操作符来表现的。


社会学必须对某些事物有利。


从数学的角度来看,操作符只是带着特殊语法的普通函数。从语言学的角度来说,操作符只是不规则动词。不过,几乎任何语言都会告诉你,在一种语言里的不规则动词很可能是你最常用的语素。而从信息理论的角度来看,这一点非常重要,因为不规则动词不管是在使用中还是识别上都比较短而且更有效。


从实用角度出发,操作符非常易用。


根据操作符的元数(它们操作数的个数)的不同,它们的优先级(它们从周围的操作符手中夺取操作数的难易)的不同,它们的结合性(当与同优先级的操作符相联时,它们是从左到右处理还是从右到左处理。)的不同,操作符可以分成各种各样类型。


Perl 的操作符有三种元数:一元,二元和三元。一元操作符总是前缀操作符(除自增和自减操作符以外)。(注:你当然可以认为各种各样的引号和括弧是项与项之间分隔的环缀操作符。)其他的都是中缀操作符——除非你把列表操作符也算进来,它可以做任意数量参数的前缀。不过大多数人认为列表操作符只是一种普通的函数,只不过你可以不为它写括弧而已。下面是一些例子:

! $x              # 一个一元操作符
$x * $y           # 一个二元操作符
$x ? $y : $z      # 一个三元操作符
print $x, $y, $z  # 一个列表操作符

操作符的优先级控制它绑定的松紧度。高优先级的操作符先于低优先级的操作符攫取它们周围的参数。优先级的原理可以直接在基本数学里面找到,在数学里,乘法比加法优先级高:

+ 3 * 4          # 生成14而不是20

两个同等优先级的操作符在一起的时候,它们的执行顺序取决于它们的结合性。这些规则在某种程度上仍然遵循数学习惯:

2 * 3 * 4        # 意味着(2*3)*4,左结合
2 ** 3 ** 4      # 意味着2**(3**4),右结合
2 != 3 != 4      # 非法,不能结合

表 3-1 列出了从高优先级到低优先级的 Perl 操作符,以及它们的结合性和元数。

表 3-1。操作符优先级

结合性 元数 优先级表
0 项,和列表操作符(左侧)
2 ->
1 ++ --
2 **
1 !~&gt和一元 + 和 -
2 =~ !~
2 * / % x
2 + - .
2 << > >
0,1 命名一元操作符
2 < > <= >= lt gt le ge
2 = <=> eq ne cmp
2 &
2 | ……
2 &&
2 ||
2 .. ...
3 ?:
2 + += -+ *= 等等
2 , =>
0+ 列表操作符(右侧)
1 not
2 and
2 or xor

看起来好象要记很多的优先级级别。不错,的确很多。幸运的是,有两件事情可以帮助你。首先,这里定义的优先级级别通常遵循你的直觉(前提是你没得精神病)。第二,如果你得了精神病,那你总还是可以放上额外的圆括弧以减轻你的疑虑。


另外一个可以帮助你的线索是,任何从 C 里借来的操作符相互之间仍然保留相同的优先级关系,尽管 C 的优先级有点怪。(这就让那些 C 和 C++ 的爱好者,甚至还包括 JAVA 的爱好者学习起 Perl 来会更容易些。)


随后的各节按照优先级顺序讲述这些操作符。只有极少数例外,所有这样的操作符都只处理标量值,而不处理列表值。我们会在轮到它们出现的时候提到这一点。


尽管引用是标量值,但是在引用上使用大多数操作符没有什么意义,因为一个数字值的引用只是在 Perl 内部才有意义。当然,如果一个引用指向一个允许重载的类里的一个对象,你就可以在这样的对象上调用这些操作符,并且如果该类为那种特定操作符定义了重载,那它也会定义那个操作符应该如何处理该对象。比如,复数在 Perl 里就是这么实现的。有关重载的更多内容,请参考第十三章,重载。

Perl
Perl 操作符