《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;

posted @ 2013-05-08 07:57  TonyChan  阅读(206)  评论(0编辑  收藏  举报