《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高效编程》学习笔记(2)【关于数值上下文、字符串上下文】

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

use 5.010;

use strict;



while (my $val = <STDIN>) {

    say $val;

}

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

  • 数组循环中跳过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);

代码结果如下:

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

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

use 5.010;

use strict;



open "";

say $!;

say $! + 0;

你可能感兴趣的:(perl)