Perl操作符就是Perl语法中的一系列符号。每一个操作符都有零个或多个操作数。可以把操作符看成是一系列特别的函数,操作数就是函数的参数。
操作符的特性
学习操作符就是了解每一个操作符的特性,比如:有几个操作数啊,与其他操作符如何结合,提供什么语境,什么语法之类的。
可以使用perldoc perlop 和 perldoc perlsyn来查看Perl操作符的相关文档。
优先级
不同的操作符有不同的优先级,处理顺序就是从优先级最高的开始处理。就像基本数学运算,先算乘除后加减,因为乘除的优先级比加减法高。
通过perldoc perlop可以查看所有操作符的优先级表。不需要特别去记忆这个表,通过简化代码,加上必要的括号,一般都不会有优先级上的困惑。
结合性
有的操作符是向左边结合的,如2+3+4,先计算2+3,然后再将结果加上4。有的是向右边结合的,如234, 先计算3**4,然后计算2的81次方。
当然你只需要知道基本的数学操作符的优先级和结合性就足够了。
操作数
0个操作数的叫零元操作符,1个操作数的叫一元操作符,2个操作数的叫2元操作符,3个操作数的叫3元操作符。操作列表的叫列表操作符。
位置
中缀运算符出现在操作数之间。大多数数学运算符都是中缀运算符,如乘号(*)就是在2个数之间的:$length * $width。
前缀运算符出现在操作数前面;后缀运算符出现在操作数后面。这些操作符通常都是一元的。前缀操作符如逻辑非(!$y),后缀运算符自增($z++)。
将操作数包围起来的操作符叫环缀操作符。如构造匿名哈希的({ }),字符操作符(qq[ ])。
还有些操作符比较奇怪,它在某些操作符后面,但是又得包围其他操作数的。比如访问哈希和数组的元素的操作符$hash{$x} ,$array[$y]。
操作符的类型
数字操作符
数字操作符为操作数提供数字语境。比如标准的数学上的操作符:
+ 加
- 减
* 乘
/ 除
** 乘方
% 模,取余
+=,-=, *=, /=, **=, %= 组合形式
-- 前缀自减
== 相等
!= 不等
> 大于
< 小于
>= 大于等于
<= 小于等于
<=> 排序中的比较符号
字符串操作符
字符串操作符为操作数提供字符串语境。比如正则表达式的绑定操作符(=~, !~),字符串连接符(.),字符串比较操作符(eq),还有sort排序中的字符串比较操作符(cmp)。
逻辑操作符
逻辑操作符为操作数提供布尔语境。如&&, ||, and, or,//,三目操作符(?:) 逻辑非 (!), not (优先级比!低) ,还有xor。
注意//和||的区别,操作符//只要目标操作数有定义就为真,即使是0和空字符串。
位操作符
位操作符提供的是数字语境。这些操作符不太常见。
左移位(<<),右移位(>>), 逐位与运算(&), 逐位或运算(|), 逐位异或运算(^), 以及组合形式(<<=,>>=,&=,|=,^=)。
特殊操作符
自增操作符的行为比较特别,当操作数是数字时就数值加一。如果是字符串就增长字符串。
my $num = 1;
my $str = 'a';
$num++;
$str++;
is( $num, 2, 'numeric autoincrement' );
is( $str, 'b', 'string autoincrement' );
no warnings 'numeric';
$num += $str;
$str++;
is( $num, 2, 'numeric addition with $str' );
is( $str, 1, '... gives $str a numeric part' );
重复操作符(x)也有着复杂的行为,在列表上下文中将列表重复;在标量上下文中,重复并连接成一个字符串。
看个例子就明白了:
my @scheherazade = ('nights') x 1001;
my $calendar = 'nights' x 1001;
my $cal_length = length $calendar;
is( @scheherazade, 1001, 'list repeated' );
is( $cal_length, 1001 * length 'nights',
'word repeated' );
my @schenolist = 'nights' x 1001;
my $calscalar = ('nights') x 1001;
is( @schenolist, 1, 'no lvalue list' );
is( length $calscalar,
1001 * length 'nights', 'word still repeated' );
范围操作符(..),在列表语境下会生成从一个操作数到另一个操作数的列表,可以是数字也可以是字符串。
在布尔语境下行为很不一样:操作符初始值为假,在左操作数为真时整体变为真值,持续这个状态直到右操作数为真时,整体再转变变为假值。
#列表语境
my @cards = ( 2 .. 10, 'J', 'Q', 'K', 'A' );
#布尔语境
foreach my $x ( 1..10 ){print $x if $x == 3..$x == 4}
# 打印 3 4
#利用该特性来方便地提取邮件正文:
while (/Hello, $user/ .. /Sincerely,/)
{
say "> $_";
}
逗号操作符(,)在标量语境时,它计算并返回左边的操作数,然后继续计算右边的操作数;在列表语境中,它从左到右依次计算2个操作数。
胖箭头操作符(=>),行为类似逗号操作符,并且会自动引起左边的操作数。参见哈希。
三点操作符是零元操作符,没有操作数,没有优先级,没有结合性。类似占位符的效果,在运行时会抛出异常。
sub some_example {
#后续补上
...
}