Я позаимствовал скрипт, используемый SteamCalculator.com , и хотел немного изменить его, чтобы захватить не только цену игр в Steam, но и цены продажи (если они существуют)
Код был чрезвычайно простым и достаточно легким для чтения.Чтобы узнать цену, которую он просматривает в HTML, с помощью функции поиска steampowered.com, извлекает все, что находится между <div class=\"col search_price\">
и </div>
, затем выполняет следующую подпрограмму:
sub formPrice($)
{
my $price = shift;
if($price =~ m/(\d+)(?:\.|,)(\d{2})/)
{
return $1.$2;
}
else
{
return 0;
}
}
Цена можетпринять одну из 4 форм, в зависимости от кода страны, в которой вы ищете цены, и от того, продается игра или нет.Вот эти четыре формы:
$9.99
<span><strike>$9.99</strike></span><br>$8.99
9,99£
<span><strike>9.99£</strike></span><br>8,99£
Как вы можете видеть, независимо от того, какую форму принимает цена, его скрипт будет захватывать самый первый экземпляр (\d+)
(первая группа цифр, возвращая 9
в каждомрегистр), а также (\d{2})
(группа из 2 цифр) после \.|,
(точка или запятая).Когда они объединяются, подпрограмма всегда возвращает 999
, независимо от того, какой из четырех форматов имеет цена.
Я пытался найти способ изменить эту подпрограмму, чтобы вернуть 999
в случаях 1 и 3, но верните 899
в случаях 2 и 4. До сих пор я пытался:
1:
if((reverse $price) =~ m/(\d+)(?:\.|,)(\d{2})/g){
return $2.$1;
}
2:
if($price =~ m/.*?(\d+)(?:\.|,)(\d{2})/g){
return $1.$2;
}
3:
if($price =~ m/.*?(\d+)(?:\.|,)(\d{2})$/){
return $1.$2;
}
Первые возвращенные цены, такие как 9199
за $19.99
.Второй .*?
все еще был жадным и возвращал 999
для $19.99
.Третий вернул 0
в случаях 3 и 4 (дело с евро)