Я бы посоветовал вам использовать не только LWP :: Simple, но и XML :: Simple .Это позволит вам привести пример данных в виде хэша хэшей.Найти самую большую версию будет намного проще.
Нельзя анализировать HTML или XML с помощью простых регулярных выражений, поскольку структура данных XML имеет слишком свободную форму.Большие структуры могут быть юридически разбиты на отдельные линии.Взгляните на этот пример:
<a href="http://foo.com/bar/bar/">The Foobar Page</a>
Он также может быть выражен как:
<a
href="http://foo.com/bar/bar/">
The Foobar Page
</a>
Если вы искали a href
, вы никогда его не найдете.Черт возьми, вы можете даже поискать a\s+href
и не найти его.
Возможно, есть более подходящие модули для анализа HTML (я обнаружил HTML :: Dom ), но яникогда не использовал их и не знаю, какой из них лучший один для использования.
Что касается поиска наибольшего номера версии:
Есть некоторые трудности, потому что есть всевиды странных и дурацких правил с нумерацией версий.Например:
2.2 < 2.10
В Perl есть нечто, называемое V-Strings , но ходят слухи, что они устарели.Если вас это не касается, вы можете использовать Perl :: Version .
В противном случае вот подпрограмма, которая выполняет сравнение версий.Обратите внимание, что я также проверяю, что каждый раздел является целым числом с помощью регулярного выражения /^\d+$/
.Моя подпрограмма может возвращать четыре значения:
0
: оба имеют одинаковый размер 1
: первое число больше 2
: второеЧисло больше undef
: что-то не так.
Вот программа:
my $minVersion = "10.3.1.3";
my $userVersion = "10.3.2";
# Create the version arrays
my $result = compare($minVersion, $userVersion);
if (not defined $results) {
print "Non-version string detected!\n";
}
elsif ($result == 0) {
print "$minVersion and $userVersion are the same\n";
}
elsif ($result == 1) {
print "$minVersion is bigger than $userVersion\n";
}
elsif ($result == 2) {
print "$userVersion is bigger than $minVersion\n";
}
else {
print "Something is wrong\n";
}
sub compare {
my $version1 = shift;
my $version2 = shift;
my @versionList1 = split /\./, $version1;
my @versionList2 = split /\./, $version2;
my $result;
while (1) {
# Shift off the first value for comparison
# Returns undef if there are no more values to parse
my $versionCompare1 = shift @versionList1;
my $versionCompare2 = shift @versionList2;
# If both are empty, Versions Matched
if (not defined $versionCompare1 and not defined $versionCompare2) {
return 0;
}
# If $versionCompare1 is empty $version2 is bigger
if (not defined $versionCompare1) {
return 2;
}
# If $versionCompare2 is empty $version1 is bigger
if (not defined $versionCompare2) {
return 1;
}
# Make sure both are numeric or else there's an error
if ($versionCompare1 !~ /\^d+$/ or $versionCompare2 !~ /\^\d+$/) {
return;
}
if ($versionCompare1 > $versionCompare2) {
return 1;
}
if ($versionCompare2 > $versionCompare1) {
return 2;
}
}
}