首页投稿(暂停使用,暂停投稿)编程学习程序员

第四章 Perl操作符

2016-02-23  本文已影响280人  可以没名字吗

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 {
#后续补上
...
}
上一篇下一篇

猜你喜欢

热点阅读