免费注册 查看新帖 |

Chinaunix

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

perl 多次匹配 多次替换 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-10-30 10:04 |只看该作者 |倒序浏览
举例:
$a = "a; b; c"; #替换成 "1; 2; 3";

现在的做法是:
$a =~s/a/1/g;
$a =~s/b/2/g;
$a =~s/c/3/g;

要正则表达式3次,能不能减少?
类似于
$a =~s/a|b|c/1|2|3/g;
这样的功能?

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
2 [报告]
发表于 2015-10-30 10:43 |只看该作者
除了减少行数,你不觉得你目前的方案更清晰明了吗?

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
3 [报告]
发表于 2015-10-30 10:54 |只看该作者
my %map = (
    'a' => 1,
    'b' => 2,
    'c' => 3,
);

my $a = 'a; b; c';

my $pattern = join "|", map "\Q$_\E", keys %map;

$a =~ s/($pattern)/$map{$1}/eg;

print $a;

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
4 [报告]
发表于 2015-10-30 12:58 |只看该作者
  1. my $str = 'abc'; $str =~ tr/a-c/1-3/; $str
复制代码

论坛徽章:
0
5 [报告]
发表于 2015-10-30 13:17 |只看该作者
  1. #!/usr/bin/perl

  2. use strict;

  3. my $str="abc1231dfeabc";

  4. $str =~ tr /[abc]/[123]/;

  5. print "$str \n";
复制代码

论坛徽章:
0
6 [报告]
发表于 2015-10-30 15:21 |只看该作者
有一个程序,如果传入参数太多,要遍历很多次替换,消耗性能,所以,希望能够一次性就替换掉。这样最好。回复 2# zhlong8


   

论坛徽章:
0
7 [报告]
发表于 2015-10-30 15:23 |只看该作者
"#|#|#"这样描述更合适,#就是我需要传入的参数用来替换的,但是参数值是变动的。请问你这个程序如何修改呢。没发现有更好的方法。回复 3# zhlong8


   

论坛徽章:
0
8 [报告]
发表于 2015-10-30 15:26 |只看该作者
我只是简单的举例而已,并不是你那个意思回复 4# 104359176


   

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
9 [报告]
发表于 2015-10-30 16:21 |只看该作者
回复 7# taojikun1986


    我写的就是最通用的模式,映射关系保存在 %map 中,你更新 %map 不就行了。不过要注意 hash 不保存顺序,如果 key 是 ab abb abbb 这种非互斥的要稍微修改下,因为生成的 pattern 可能是 (ab|abb|abbb) 也可能是 (abb|ab|abbb) 等等不保证最长的优先

论坛徽章:
0
10 [报告]
发表于 2015-10-30 16:42 |只看该作者
谢谢!我改改看。回复 9# zhlong8


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP