免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: ste2008
打印 上一主题 下一主题

反向引用得到 $1,$2...$100,怎么遍历他们? [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
1 [报告]
发表于 2007-01-27 13:27 |显示全部楼层
方法有三:
1,模式匹配时记录匹配结果,这是最常用的:
  1. my $var = "abcdefg";
  2. my @matchs = $var =~ /(a)(b)(c)(d)(.{0})efg/;
  3. foreach my $match (@matchs){
  4.     print $match, "\n";
  5. }
复制代码

2,用 @- @+ 两个变量就可以取到,这个方法很少有人知道,没什么用处,也很少有人使用。
  1. my $var = "abcdefg";
  2. $var =~ /(a)(b)(c)(d)(.{0})efg/;
  3. foreach my $i (1..$#-) {
  4.         print substr( $var, $-[$i], $+[$i]-$-[$i] ), "\n";
  5. }
复制代码

3,用 no strict 'refs' 临时打开符号引用,然后构造符号引用:
  1. my $var = "abcdefg";
  2. $var =~ /(a)(b)(c)(d)(.{0})efg/;
  3. foreach my $i (1..100){
  4.     no strict 'refs';
  5.     last if not defined $$i;
  6.     print $$i, "\n";
  7. }
复制代码

[ 本帖最后由 flw 于 2007-1-27 13:49 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2007-01-27 13:41 |显示全部楼层
原帖由 ste2008 于 2007-1-27 13:36 发表


谢谢你
第1和第3种方法都用了数组,性能不好,而不如用split好了

第二种方法没看明白,因为我要的是 $2..$4,也就是匹配5个,但是这里只判断 $2,$3,$4
当然$1和$5也要保留的,别的地方要判断

哦,不好意思,第三个方法我多写了半句,其实是不需要 @matchs 数组的,那是第一个例子残留的,应该删掉。
第二个方法应该能满足你的要求。如果只要 2 3 4,就写
  1. my $var = "abcdefg";
  2. $var =~ /(a)(b)(c)(d)(.{0})efg/;
  3. foreach my $i (2,3,4) {
  4.         print substr( $var, $-[$i], $+[$i]-$-[$i] ), "\n";
  5. }
复制代码

好了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP