haixin3036 发表于 2015-12-29 08:01:41

《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]
查看完整版本: 《PERL高效编程》学习笔记(2)【关于数值上下文、字符串上下文】