免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3283 | 回复: 16
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-23 19:13 |只看该作者 |倒序浏览
反向引用得到 $1,$2...$100,怎么遍历他们?

比如
foreach $n(50..80)
{
   print $50一直到$80
}

怎么方便地遍历呢,而不是一个个地写,谢谢

论坛徽章:
0
2 [报告]
发表于 2007-01-23 20:17 |只看该作者
#!/usr/bin/perl
use strict;
use warnings;

my $var = "abcdefg";
$var =~ /(a)(b)(c)(d)(e)/;
foreach my $match ($1..$5) {
        print $match, "\n";
}

[ 本帖最后由 alexru 于 2007-1-23 20:19 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2007-01-23 21:16 |只看该作者
原帖由 ste2008 于 2007-1-23 19:13 发表
反向引用得到 $1,$2...$100,怎么遍历他们?

比如
foreach $n(50..80)
{
   print $50一直到$80
}

怎么方便地遍历呢,而不是一个个地写,谢谢


如果偶理解正确的话,你是想对变量名进行遍历取值吧?可以用eval做到:

  1. use strict;

  2. my $c = "abc";
  3. my $d = "cde";
  4. my $e = "fgh";

  5. for ('c' .. 'e') {
  6.     my $str = '$' . $_;
  7.     print eval "$str","\n";
  8. }
复制代码

论坛徽章:
0
4 [报告]
发表于 2007-01-27 12:27 |只看该作者
谢谢二位
都可以实现,但是eval效率很低

这样不能返回$1..$5,假设$5为空,
my $var = "abcdefg";
$var =~ /(a)(b)(c)(d)(.{0})efg/;
foreach my $match ($1..$5) {
        print $match, "\n";
}

论坛徽章:
0
5 [报告]
发表于 2007-01-27 13:04 |只看该作者
或者直接用shell更快
for srv in `ls`;do
file(你要的动作) $srv
done

论坛徽章:
0
6 [报告]
发表于 2007-01-27 13:08 |只看该作者
很感谢,但是不能用shell,因为在win上执行的

而且
my $var = "abcdefg";
$var =~ /(a)(b)(c)(d)(.{0})efg/;
&showprint;

sub showprint($){
$tmp=shift;
print "$tmp";
}
没有任何结果

我希望速度快,因为要处理很多行
而且是处理 比如 $10..$30, 并不是全部

论坛徽章:
0
7 [报告]
发表于 2007-01-27 13:10 |只看该作者
windows就是用来娱乐用的
工作还是在linux下比较好

论坛徽章:
0
8 [报告]
发表于 2007-01-27 13:16 |只看该作者
原帖由 helbreathszw 于 2007-1-27 13:10 发表
windows就是用来娱乐用的
工作还是在linux下比较好


谢谢
这个不是我能决定的了

可是你第一次给我的代码不能用啊

不过还是谢谢你

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 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 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2007-01-27 13:36 |只看该作者
原帖由 flw 于 2007-1-27 13:27 发表
方法有三:
1,模式匹配时记录匹配结果,这是最常用的:
[code]my $var = "abcdefg";
my @matchs = $var =~ /(a)(b)(c)(d)(.{0})efg/;
foreach my $match (@matchs){
    print $match, "\n& ...


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

第二种方法没看明白,因为我要的是 $2..$4,也就是匹配5个,但是这里只判断 $2,$3,$4
当然$1和$5也要保留的,别的地方要判断
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP