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分成数组,然后逐行判断比较,这是可行的。
但我想应该有很简单的办法,可是不知道正则表达式哪里写错了。看以下代码:
my ($eth2_rx, $eth2_tx, $eth3_rx, $eth3_tx) = (0, 0, 0, 0);
if($result_begin =~ /RX packets\:([0-9]+)(.+)TX packets\:([0-9]+)(.+)RX packets\:([0-9]+)(.+)TX packets\:([0-9]+)/) {
($eth2_rx, $eth2_tx, $eth3_rx, $eth3_tx) = ($1, $3, $5, $7);
}
复制代码
作者:
finixlei
时间:
2010-10-13 17:23
if的条件判断不满足,不知道应该怎么写里面的正则表达式。
作者:
珞水的大叔
时间:
2010-10-13 17:41
本帖最后由 珞水的大叔 于 2010-10-13 17:44 编辑
回复
2#
finixlei
你的问题在于字符串中有换行符\n,而正则表达式中的“.”不能匹配\n。
只要在正则表达式后加上修饰符s,即可解决问题,如下:
$result_begin =~ /RX packets\:([0-9]+)(.+?)TX packets\:([0-9]+)(.+?)RX packets\:([0-9]+)(.+?)TX packets\:([0-9]+)/s
复制代码
如果你的问题处理量比较大的话,还可以对表达式做如下优化:
if($result_begin =~ /RX packets\:([0-9]+)(?:.+?)TX packets\:([0-9]+)(?:.+?)RX packets\:([0-9]+)(?:.+?)TX packets\:([0-9]+)/s) {
($eth2_rx, $eth2_tx, $eth3_rx, $eth3_tx) = ($1, $2, $3, $4);
}
复制代码
作者:
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