perl中的字符串解析

时间:2015-01-13 18:34:08

标签: string perl parsing http

我需要一些关于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+)};

但是当我打印出这条线时,我看到一些奇怪的东西:字符丢失,线条空间等。 似乎我有一些奇怪的隐形字符会造成混乱。

你能否建议我在两个数字变量中使用两个数字的更好方法?

由于 法比奥

3 个答案:

答案 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+)?)/;