Chinaunix

标题: 请教一句话的写法 [打印本页]

作者: finixlei    时间: 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. }
复制代码

作者: finixlei    时间: 2010-10-13 17:23
if的条件判断不满足,不知道应该怎么写里面的正则表达式。
作者: 珞水的大叔    时间: 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. }
复制代码

作者: finixlei    时间: 2010-10-13 17:59
原来点号不能匹配“\n",后加s才可。好久不用都忘记了。多谢了!
后面没太看明白,(?:.+?) 是什么意思?是类似于C语言中的问号操作符吗?还是仍是正则表达式?
作者: 珞水的大叔    时间: 2010-10-13 18:11
回复 4# finixlei


    (?:.+?)里面
    (?:)表示不保存括号里面匹配的内容到变量 $数字 中
    .+?表示.+的非贪婪模式
    这两个都是为了节省正则表达式匹配时的开销
作者: speed0424    时间: 2010-10-13 18:27
原来点号不能匹配“\n",后加s才可。好久不用都忘记了。多谢了!
后面没太看明白,(?:.+?) 是什么意思?是 ...
finixlei 发表于 2010-10-13 17:59

非捕捉括号,就是变成一个项,但是又不存入$n中。
作者: flw    时间: 2010-10-13 18:51
用 my @lines = `ifconfig -a`;
不要用 my $ifconfig = `ifconfig -a`;
作者: linux_arm    时间: 2010-10-13 20:33
flw一针见血,呵呵




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2