• 《PERL高效编程》学习笔记(2)【关于数值上下文、字符串上下文】


    • ==用于比较数值,与C不同的是,当用==比较字符时(同>,<),纯粹的字符串会转变为数值0,夹杂数字的字符串会忽略字符串中的非数字部分,最终将字符串转换为数值上下文。
    use 5.010;
    use strict;
    
    say '10abc' == '10bcd';
    say '10abc' < '11bcd';
    say 0 == 'bcd';
    say 'abc' == 'bcd';
    say 0 < '1bcd';

    • 智能匹配

    启动智能匹配需确保PERL版本早5.10.1以上。

    use 5.010;
    use strict;
    
    say '10abc' ~~ '10bcd';
    say '10abc' ~~ '11bcd';
    say 0 ~~ 'bcd';
    say 'abc' ~~ 'bcd';
    say 0 ~~ '0bcd';
    say '123' ~~ '123.0';
    
    #以上全假
    
    say '123' ~~ 123;
    
    #以上为真
    • PERL中的假值

    0,'0',undef,''。

    WHILE语句遇到假值时会跳出,所以如下代码在碰到抓取的文件名为0时存在BUG:

    use 5.010;
    use strict;
    
    #存在漏洞
    while (my $file = glob('*')) {
        say $file;
    }
    
    #应该改成
    while (defined (my $file = glob('*'))) {
        say $file;
    }

    <>有些不同,它会自动过滤假值:

    use 5.010;
    use strict;
    
    while (<STDIN>) {
        say $_;
    }

    * 《PERL高级编程》第二版中P12最后一行“如果想将当前读到的某行赋值给其他变量,那我们得自己做defined检查”。这句话经实测后发现有误,反编译后发现同样会进行defined检查。

    use 5.010;
    use strict;
    
    while (my $val = <STDIN>) {
        say $val;
    }

    • 数组循环中跳过undef 备忘
    use 5.010;
    use strict;
    
    foreach my $cat (@cats){
        next unless defined $cat;
        print "defined";
    }
    • 字符串和数字之间的转换

    使用Dump函数查看细节:

    use 5.010;
    use strict;
    use Devel::Peek qw(Dump);
    
    my $a = "12fred343";
    
    print STDERR "Before conversion: ";
    Dump($a);
    
    my $b = $a + 0;
    print STDERR "After conversion: ";
    Dump($b);

    代码结果如下:

    对于$!,在数字上下文中返回以数字代表错误类型的系统变量errno,在字符串上下文中返回perror()函数中提供的字符串错误信息。

    use 5.010;
    use strict;
    
    open "";
    say $!;
    say $! + 0;

  • 相关阅读:
    跨域问题
    window7_64+python3.6安装Twisted
    resful协议1
    Http状态码
    数据库学习笔记
    linux学习笔记
    前端学习笔记
    python学习笔记
    mongoDB
    git的使用方法
  • 原文地址:https://www.cnblogs.com/tonychan/p/3066110.html
Copyright © 2020-2023  润新知