《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;
页:
[1]