第四章 Perl操作符

作者: 可以没名字吗 | 来源:发表于2016-02-23 13:13 被阅读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 {
    #后续补上
    ...
    }
    

    相关文章

      网友评论

        本文标题:第四章 Perl操作符

        本文链接:https://www.haomeiwen.com/subject/dzvbkttx.html