Perl正则表达式匹配异常求助:表达式无法正确评估
问题根源:正则表达式变量赋值错误
兄弟,我一眼就瞅见问题出在哪了!你所有匹配规则失效的核心原因,是没正确把正则表达式存进变量里!
在Perl里,直接写my $white = /^\s*$/;的时候,Perl会把它当成「用这个正则去匹配当前默认变量$_」的操作,最后把匹配结果(成功返回1,失败返回空值)存到变量里,而不是把正则表达式本身存进去。这就导致后面$param =~ $white的操作,其实是拿$param去匹配1或者空值,肯定不可能成功啊!
修正方案:用
qr//创建正则表达式引用 Perl里要把正则表达式保存到变量中,必须用qr//操作符——它会生成一个正则表达式对象,这样后续才能用它来做匹配。
修正后的完整代码示例:
my $param = "02 1999"; my @months = qw(january february march april may june july august september october november december); # 用qr//创建正则表达式引用,这才是正确姿势! my $white = qr/^\s*$/; #检查是否全为空白字符 my $singleyear = qr/^\d{2,4}$/; #检查是否为2-4位数字 my $nummonth = qr/^\d{1,2}\s\d{1,4}$/; #检查是否为1-2位数字加1-4位数字 if ($param =~ $white) { # 全空白的处理逻辑 print "全是空白字符\n"; } elsif ($param =~ $singleyear) { # 单独年份的处理逻辑 print "是2-4位数字的年份\n"; } elsif ($param =~ $nummonth) { # 数字月份+年份的处理逻辑 print "匹配数字月份+年份的格式\n"; } else { print "没有匹配到任何规则\n"; }
额外小提示
qr//不仅能正确存储正则,还支持添加修饰符(比如忽略大小写的i:qr/^\s*$/i),灵活性拉满。- 要是不想用
qr//,也可以把正则写成字符串(比如my $white = '^\s*$';),但qr//是Perl官方推荐的方式,性能更好也更易维护。
内容的提问来源于stack exchange,提问作者user3066571
相关产品推荐
相关产品推荐

