当前位置: 首页 > news >正文

perl踩坑系列=====正则表达式捕获

#!/usr/bin/perl -w
use strict;my $cigar = "18S20M30D20I50H";my $read_span = 0;while($cigar =~ s/([0-9]+)([MIDNSHP=X])//){#$read_span += $1; #这个不会报错if ($2 =~ /[MD]/) {$read_span += $1;} #这个报错,匹配几次就报错几次
}print "read_span\t$read_span\n";

运行之后,报错的信息如下:

Use of uninitialized value $1 in addition (+) at a.pl line 11.
Use of uninitialized value $1 in addition (+) at a.pl line 11.
read_span       0

为什么直接“$read_span += $1;”不会报错,

而多一个if条件中的“if ($2 =~ /[MD]/) {$read_span += $1;}” 就会报错?

原因在于$1,$2这类神奇的变量,

每发生一次正则表达式匹配,会生成一套新的捕获结果$1,$2....$n.

哪怕没有指定$1, $2,等,这些变量也会被undef代替,

而不是用上次匹配的$1,$2.

以我的例子来说,while循环每循环一次,会发生两次匹配。

第一次是:

$cigar =~ s/([0-9]+)([MIDNSHP=X])//

第二次是:

if ($2 =~ /[MD]/) {$read_span += $1;}

很明显,if条件语句中的$1是对应    $2 =~ /[MD]/   的,

而这次匹配并没有指定捕获什么, 所以$1变成undef, 

此时再去操作$1(已经变成了undef),当然会报错

当然,匹配一次,重新生成一次$1...$n的前提是得匹配成功

比如,重新修改一下代码:

#!/usr/bin/perl -w
use strict;my $cigar = "18S20M30D20I50H";my $read_span = 0;while($cigar =~ s/([0-9]+)([MIDNSHP=X])//){#$read_span += $1;if ($2 =~ /[MD]/) {$read_span += $1;}print "$1\t$2\n";
}print "read_span\t$read_span\n";

输出信息(包括报错信息)如下:

18      S
Use of uninitialized value $1 in addition (+) at c.pl line 11.
Use of uninitialized value $1 in concatenation (.) or string at c.pl line 12.
Use of uninitialized value $2 in concatenation (.) or string at c.pl line 12.

Use of uninitialized value $1 in addition (+) at c.pl line 11.
Use of uninitialized value $1 in concatenation (.) or string at c.pl line 12.
Use of uninitialized value $2 in concatenation (.) or string at c.pl line 12.

20      I
50      H
read_span       0

可以看出,

如果 $2 =~ /[MD]/   没有成功,$1就仍然是 $cigar =~ s/([0-9]+)([MIDNSHP=X])// 的。

只要 $2 =~ /[MD]/ 匹配成功了, $1,$2 都会变。

那么对应的策略就是:

谨慎使用$1...$n,最好第一时间赋值给其他变量

比如:

#!/usr/bin/perl -w
use strict;my $cigar = "18S20M30D20I50H";my $read_span = 0;while($cigar =~ s/([0-9]+)([MIDNSHP=X])//){#$read_span += $1;my $number = $1;my $operation = $2;if ($operation =~ /[MD]/) {$read_span += $number;}
}print "read_span\t$read_span\n";

http://www.dtcms.com/a/410276.html

相关文章:

  • MQ-2烟雾传感器详解——从工作原理到实际应用
  • Ubuntu启动终端时默认窗口最大化
  • 整站seo排名郑州经济技术开发区政务服务中心
  • 求一些做里番的网站php网站建设实训引言
  • 嵌入用户idea到大模型并针对Verilog语言生成任务的微调实验报告
  • 【AI算力系统设计分析】1000PetaOps 算力云计算系统设计方案(大模型训练推理专项版)
  • JAVA露营基地预约户外露营预约下单系统小程序
  • ✨WPF编程基础【1.2】:XAML中的属性
  • 【MySQL】性能优化与核心机制深度解析
  • 珠海 网站建设和推广网站建设服务方案ppt模板下载
  • JUC:AQS源码分析(三)
  • 极简文件列表
  • CSS Grid 网格布局完整指南:从容器到项目,实战详解
  • 百度手机模板网站阿里云WordPress主题
  • 批量获取oracle的AWR报告方法
  • docker jenkins gitlab 流水线构建
  • MySQL 配置调优参数:从基础到生产级优化指南
  • 旅游网站设计模板cdr里做网站超级链接
  • TypeScript + React + Ant Design 前端架构入门:搭建一个 Flask 个人博客前端
  • 小九源码-springboot051-智能推荐旅游平台
  • 网站建设面试问题网站建设 学习 长沙
  • 【云原生】openebs-device+cstor存储方案部署
  • 破译古籍密码,HisDoc-DETR论文解读
  • Kafka 面试题及详细答案100道(66-80)-- 运维与部署
  • 衡阳网站优化公司个人网站可以做音乐吗
  • 怎么iis设置网站太原网站建设外包
  • UVa1008/LA2240 A Vexing Problem
  • 如何利用Yarn定位数据倾斜问题?
  • 开源 C# 快速开发(四)自定义控件--波形图
  • javaweb3【ServletContext知识】