免费注册 查看新帖 |

Chinaunix

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

请教一句话的写法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-10-13 17:22 |只看该作者 |倒序浏览
有一个变量$result, 存储的是以下内容:
eth2      Link encap:Ethernet  HWaddr 00:1E:67:01:21:04  
          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1
          RX packets:1080341 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1024529 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:663682075 (632.9 MiB)  TX bytes:976556689 (931.3 MiB)
          Interrupt:16 Base address:0x2020 Memory:b8c60000-b8c80000

eth3      Link encap:Ethernet  HWaddr 00:1E:67:01:21:05  
          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1
          RX packets:1038395 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1221259 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:970460899 (925.5 MiB)  TX bytes:689933196 (657.9 MiB)
          Interrupt:17 Base address:0x2000 Memory:b8c20000-b8c40000

现在想取4个数值,分别是eth2和eth3的RX Packets和TX Packets. 我现在的做法比较笨,用split将result分成数组,然后逐行判断比较,这是可行的。
但我想应该有很简单的办法,可是不知道正则表达式哪里写错了。看以下代码:

  1. my ($eth2_rx, $eth2_tx, $eth3_rx, $eth3_tx) = (0, 0, 0, 0);
  2. if($result_begin =~ /RX packets\:([0-9]+)(.+)TX packets\:([0-9]+)(.+)RX packets\:([0-9]+)(.+)TX packets\:([0-9]+)/) {
  3.             ($eth2_rx, $eth2_tx, $eth3_rx, $eth3_tx) = ($1, $3, $5, $7);
  4. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2010-10-13 17:23 |只看该作者
if的条件判断不满足,不知道应该怎么写里面的正则表达式。

论坛徽章:
0
3 [报告]
发表于 2010-10-13 17:41 |只看该作者
本帖最后由 珞水的大叔 于 2010-10-13 17:44 编辑

回复 2# finixlei


    你的问题在于字符串中有换行符\n,而正则表达式中的“.”不能匹配\n。
   只要在正则表达式后加上修饰符s,即可解决问题,如下:
  1. $result_begin =~ /RX packets\:([0-9]+)(.+?)TX packets\:([0-9]+)(.+?)RX packets\:([0-9]+)(.+?)TX packets\:([0-9]+)/s
复制代码
如果你的问题处理量比较大的话,还可以对表达式做如下优化:
  1. if($result_begin =~ /RX packets\:([0-9]+)(?:.+?)TX packets\:([0-9]+)(?:.+?)RX packets\:([0-9]+)(?:.+?)TX packets\:([0-9]+)/s) {
  2.             ($eth2_rx, $eth2_tx, $eth3_rx, $eth3_tx) = ($1, $2, $3, $4);
  3. }
复制代码

论坛徽章:
0
4 [报告]
发表于 2010-10-13 17:59 |只看该作者
原来点号不能匹配“\n",后加s才可。好久不用都忘记了。多谢了!
后面没太看明白,(?:.+?) 是什么意思?是类似于C语言中的问号操作符吗?还是仍是正则表达式?

论坛徽章:
0
5 [报告]
发表于 2010-10-13 18:11 |只看该作者
回复 4# finixlei


    (?:.+?)里面
    (?:)表示不保存括号里面匹配的内容到变量 $数字 中
    .+?表示.+的非贪婪模式
    这两个都是为了节省正则表达式匹配时的开销

论坛徽章:
0
6 [报告]
发表于 2010-10-13 18:27 |只看该作者
原来点号不能匹配“\n",后加s才可。好久不用都忘记了。多谢了!
后面没太看明白,(?:.+?) 是什么意思?是 ...
finixlei 发表于 2010-10-13 17:59

非捕捉括号,就是变成一个项,但是又不存入$n中。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2010-10-13 18:51 |只看该作者
用 my @lines = `ifconfig -a`;
不要用 my $ifconfig = `ifconfig -a`;

论坛徽章:
0
8 [报告]
发表于 2010-10-13 20:33 |只看该作者
flw一针见血,呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP