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