一次布尔测试
在标量上下文里,返回值是 true / false:
找到 → 1
没找到 → 空串(Perl 把空串当 false)
$date =~ /regex/ # 问:$date 里出现过 regex 吗?答:1 / ""
if ($date =~ /regex/) { } # 只有找到才进花括号
if ($date =~ /^\d{4}-\d{2}-\d{2}$/) {
say "合法日期";
}
if ($date =~ /(\d{4})-(\d{2})-(\d{2})/) {
my ($y,$m,$d) = ($1,$2,$3); # 用捕获组
}
my @years = $date =~ /(\d{4})/g;
$date =~ s/-///g; # 把 - 换成 /
注意:
$var =~ /pattern/不会像shell一样将返回值存在$?,
只是立即返回一个标量值(匹配成功为 1,失败为 "")。
真正想“存起来”必须自己接住:
my $ok = $var =~ /pattern/;
在控制台里用 Data::Dumper、defined 或 length 就能一眼看出它到底是空串、还是 undef
最直观:用 Data::Dumper
use Data::Dumper;
my $v = $var =~ /pattern/;
print Dumper($v); # 输出 $VAR1 = ''; 或 $VAR1 = 1;
简单判断:defined + length
my $v = $var =~ /pattern/;
print defined $v ? "defined=$v,len=".length($v)."\n" : "undef\n";
一行调试:直接打印带引号
print "'$v'\n"; # 空串会显示 '',undef 会触发警告
布尔上下文测试
print $v ? "true\n" : "false\n";
选 1 或 2 最稳妥,空串会明确显示 '',undef 会告诉你“undef”。
正则匹配的操作如果在列表上下文(上面说的都是标量上下文),则保存各个分组捕获的内容。所以,出于方便,可以通过下面的方式直接将分组捕获的结果赋值给指定变量:
$date = "2018-11-22";
($year,$mon,$day) = ($date =~ /(\d{4})-(\d{2})-(\d{2})/);