首页 新闻 会员 周边 捐助

Perl 中的 $var =~ /pattern/

0
[已关闭问题] 关闭于 2025-08-01 10:34

一次布尔测试
在标量上下文里,返回值是 true / false:
找到 → 1
没找到 → 空串(Perl 把空串当 false)

$date =~ /regex/ # 问:$date 里出现过 regex 吗?答:1 / ""
if ($date =~ /regex/) { } # 只有找到才进花括号

_java_python的主页 _java_python | 小虾三级 | 园豆:984
提问于:2025-08-01 10:31
< >
分享
所有回答(1)
0

1. 直接当条件

if ($date =~ /^\d{4}-\d{2}-\d{2}$/) {
say "合法日期";
}

2. 取匹配结果

if ($date =~ /(\d{4})-(\d{2})-(\d{2})/) {
my ($y,$m,$d) = ($1,$2,$3); # 用捕获组
}

3. 列表上下文 → 返回所有匹配(列表上下文)

my @years = $date =~ /(\d{4})/g;

4. 结合 s/// 或 tr/// 做替换/转置

$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})/);

_java_python | 园豆:984 (小虾三级) | 2025-08-01 10:34
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册