免费注册 查看新帖 |

Chinaunix

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

perl if 匹配中如何屏蔽掉特殊字符$,@, +等的解析。 [复制链接]

论坛徽章:
2
数据库技术版块每日发帖之星
日期:2015-10-28 06:20:00数据库技术版块每日发帖之星
日期:2015-10-29 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-12-29 00:22 |只看该作者 |倒序浏览
场景:假如/tmp下面有3个子目录为$b, g++, g@:F。
文件~/a内容如下其下面的子文件大小):
  1. 20  /tmp/$b/b1
  2. 20  /tmp/$b/b2
  3. 20  /tmp/$b/b3

  4. 10  /tmp/g++/g1
  5. 10  /tmp/g++/g2
  6. 10  /tmp/g++/g3

  7. 40  /tmp/g@:F/g1
  8. 40  /tmp/g@:F/g2
  9. 40  /tmp/g@:F/g3
复制代码
现在想把~/a 中包括 /tmp/$b, /tmp/g++, /tmp/g@:F 行的第1列都相加(思路是: 用perl命令行,抓取~/a中包括 关键字的行,然后将其第1列相加):
  1. my @dir=`ls /tmp`;
  2. foreach my $one_dir (@dir) {
  3.         chomp $one_dir;
  4.         my $size = `perl -ne 'our \$t;
  5.         \$t+=\$1 if m{^\\s*(\\d+)\\s+$one_dir};
  6.         END {print "\$t\\n"}' $ENV{HOME}/a`;  
  7.         print "$size\n";
  8. }
复制代码
但是会报错,原因是 上面的if m{ $one_dir } 中包含了特殊字符$, @, +。
在 if 匹配里面:既能够 将 $one_dir变量解析为字符串,但是又能够屏蔽掉字符串里面的特殊字符呢?

附:上面只是一个例子,实际中还可能存在很多其它的特殊字符。

麻烦大家帮忙看下。
深夜发帖求助,不容易哈。
多谢

论坛徽章:
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-12-29 09:32 |只看该作者
"\Qa+b-c*d\E"  \Q \E 之间所有的非字符都会加 \ ,变成 "a\+b\-c\*d" 也可以用对应的函数 quotemeta

论坛徽章:
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-12-29 09:33 |只看该作者
啊,那个叫非数字字母

论坛徽章:
2
数据库技术版块每日发帖之星
日期:2015-10-28 06:20:00数据库技术版块每日发帖之星
日期:2015-10-29 06:20:00
4 [报告]
发表于 2015-12-29 21:27 |只看该作者
回复 2# zhlong8

您好,我按照您的方法试了,还是不行。
不论是 "\\Q$one_dir\\E" 或者是 \\Q$one_dir\\E,
都不行。

size结果为空。
麻烦继续帮忙看下

论坛徽章:
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
5 [报告]
发表于 2015-12-30 00:24 |只看该作者
回复 4# weichanghe2000


    看清楚啊,\\Q \\E 是什么东西,我就加了一个反斜杠。这是个语法,编译后相当于字符串连接     '前面的' . quotemeta('QE之间的内容') . '后面的内容'

论坛徽章:
2
数据库技术版块每日发帖之星
日期:2015-10-28 06:20:00数据库技术版块每日发帖之星
日期:2015-10-29 06:20:00
6 [报告]
发表于 2015-12-30 01:05 |只看该作者
本帖最后由 weichanghe2000 于 2015-12-30 01:13 编辑

回复 5# zhlong8

版主,您好,用1个\Q \E 也是一样的哈,$size还是为空。
您可不可以在您那边也创建一个文件a 和几个那样的目录 试下哈?

文件a如下:
  1. 20  /tmp/$b/b1
  2. 20  /tmp/$b/b2
  3. 20  /tmp/$b/b3

  4. 10  /tmp/g++/g1
  5. 10  /tmp/g++/g2
  6. 10  /tmp/g++/g3

  7. 40  /tmp/g@:F/g1
  8. 40  /tmp/g@:F/g2
  9. 40  /tmp/g@:F/g3
复制代码
脚本如下:
  1. my @dir=`ls /tmp/spe`;
  2. foreach my $one_dir (@dir) {
  3.         chomp $one_dir;
  4.         print "one_dir: $one_dir\n";
  5.         my $size = `perl -ne 'our \$t;
  6.         \$t+=\$1 if m{^\\s*(\\d+)\\s+"\Q$one_dir\E"};
  7.         END {print "\$t\\n"}' $ENV{HOME}/a`;  
  8.         print "size: $size\n";
  9. }
复制代码

论坛徽章:
2
数据库技术版块每日发帖之星
日期:2015-10-28 06:20:00数据库技术版块每日发帖之星
日期:2015-10-29 06:20:00
7 [报告]
发表于 2015-12-30 10:29 |只看该作者
本帖最后由 weichanghe2000 于 2015-12-30 10:33 编辑

回复 6# weichanghe2000


找到原因了,
1.  $one_dir前面还要加一个绝对路径,
2.  \Q 和 \E 不能用 ""  括起
3.  \Q 和 \E 只用1个\
4.  \d+, \s* 用2个\

多谢版主大神哈。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP