我需要一些关于perl中字符串解析的帮助。 我有一个http服务器响应这样的事情:
<html>
<head><title></title></head><body>
T:17.10;H:32.10
</body></html>
我需要捕获这两个数字(在示例17.10和32.10中)并将它们放在两个变量中,我将用它来做一些if ... then ... else cycle。
我不太专注于字符串操作和正则表达式,目前我还是想要这样做:
my $url = 'http://192.168.25.9';
my $content = get $url;
die "Couldn't get $url" unless defined $content;
my @lines = split /\n/, $content;
$content2 = $lines[2];
$content2 =~ tr/T://d;
$content2 =~ tr/H://d;
my @lines2 = split /;/, $content2;
$tem = $lines2[0];
$hum = $lines2[1];
$tem =~ m{(\d+\.\d+)};
$hum =~ m{(\d+\.\d+)};
但是当我打印出这条线时,我看到一些奇怪的东西:字符丢失,线条空间等。 似乎我有一些奇怪的隐形字符会造成混乱。
你能否建议我在两个数字变量中使用两个数字的更好方法?
由于 法比奥
答案 0 :(得分:6)
完整的解决方案,避免使用REGEX解析HTML(参考:RegEx match open tags except XHTML self-contained tags ):
use strict; use warnings;
# base perl module to fetch HTML
use LWP::UserAgent;
# base perl module to parse HTML
use HTML::TreeBuilder;
# fetching part
my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new(GET => "http://192.168.25.9");
my $res = $ua->request($req);
die $res->status_line, "\n" unless $res->is_success;
# parsing part
my $tree = HTML::TreeBuilder->new();
# get text from HTML
my $out = $tree->parse($res->decoded_content)->format;
# extract the expected string from the text output
if ($out =~ /^\s*T:(\d{2}\.\d{2});H:(\d{2}\.\d{2}).*/) {
print join "\n", $1, $2;
}
17.10
32.10
答案 1 :(得分:2)
特别是对于此类请求,您可以这样做:
my ($t, $h) = map { (/T:(\d+|\d+.\d+);H:(\d+|\d+.\d+)/)?($1, $2):() } @req;
print "$t, $h\n", $t * $h;
<强>输出:强>
17.10, 32.10
548.91
其中@req
是一个包含所接收请求的chomped字符串的数组
答案 2 :(得分:0)
为了您的目的,这就是您所需要的:
my ($tem, $hum) = $content =~ /T:(\d{2}\.\d{2});H:(\d{2}\.\d{2})/;
如果您需要更一般的解析(例如支持温度或湿度&gt; = 100,单位数值等):
my ($tem, $hum) = $content =~ /T:(\d+(?:\.\d+)?);H:(\d+(?:\.\d+)?)/;