简要概述......我家里有一个油箱监控器,通过串口输出数据,包括油箱中的油位。在大多数情况下,输出是一致的,但在小时和随机的“特殊事件”上,它会发送一些略有不同的内容。
以下是从端口转储的示例,换行符等。作为原始。
20:23,Ull=000
20:24,Ull=000
RX:033 CMs,048 *F
20:25,Ull=000
20:26,Ull=000
20:29,Ull=000
RX:033 CMs,051 *F (Fast)
Chosen:0,Hour:10,033 CMs,051 *F
RX:033 CMs,051 *F (Fast)
Chosen:0,Hour:10,033 CMs,051 *F
20:34,ull=000
我想从这个输出中提取的是在这种情况下'ull ='之后的数字000但数字总是一个3位整数,并且总是有前导0即。 '033'或'001'或'259'
当它没有发送'HH:MM,ull = nnn'格式时,输出可以被忽略,因为它只会持续10分钟最多再返回标准输出
使用我的电力监视器作为模板,我的电力监视器工作类似但输出更稳定我已经提出......
#!/usr/bin/perl -w
# Read data from oil tank sensor via USB-serial port.
use strict;
use Device::SerialPort qw( :PARAM :STAT 0.07 );
use WWW::Mechanize;
open STDERR, '>/dev/null';
my $PORT = "/dev/ttyUSB2";
my $ob = Device::SerialPort->new($PORT);
$ob->baudrate(115200);
$ob->write_settings;
open(SERIAL, "+>$PORT");
while (my $line = <SERIAL>) {
if ($line =~ m!ull=(\d+)!) { # trying and failing to extract the data on this line
my $oil = $1*1234; # once the value is successfully captured I'll process
# it and send it for viewing & storage on the internet.
#send the oil volume value to emoncms (this section works ok.)
my $ua = WWW::Mechanize->new();
my $url = "http://emoncms.org/input/post?json={oil:$oil}&apikey=MY API KEY";
my $response = $ua->get($url);
}
}
这只是在后台运行。
我认为字符串中的','或'='可能会让我感到沮丧,因为我可以将字符串的其他随机部分输入到变量中,但从来没有我需要的值。任何帮助将不胜感激,因为我似乎使用了我能想到的所有符号的随机组合{} *。!m \ // g / \ n!等等......以及其他什么都无济于事!!
这是一种实验,因为我甚至不能100%确定'ull'值是什么,但我希望它是从传感器到油箱表面的距离!时间会证明。
答案 0 :(得分:0)
那是因为你试图将你的正则表达式与完整的字符串相匹配,但事实并非如此。由于ull=(\d+)
与包含该模式的长字符串不匹配。它只会匹配完全匹配该模式的字符串。
此外,如果您的号码肯定是length 3
,那么您可以在正则表达式中明确指定。那里你不需要+
量词。而是{3}
量词,或0\d{2}
,因为您的号码以0
开头。并添加i
标记,以case-insensitive
方式进行匹配。
尝试使用: -
if ($line =~ m!.*?ull=(0\d{2}).*!i)