Perl — разбиение переменной из ввода на две для URL-адреса

Я загружаю данные из .txt для очистки. Однако URL-адрес требует, чтобы я разбил эту переменную и сделал +/- 2 к ней. Например, если значение равно 2342, мне нужно создать 2340 и 2344 для целей URL.

Я догадывался, как его разбить:

 $args{birth_year} = ($args{birth_year} - 2) . '-' . ($args{birth_year} + 2);

Как мне тогда поместить его в URL?

Вот соответствующая часть кода:

  use strict;
  use warnings;
  use WWW::Mechanize::Firefox;
  use Data::Dumper;
  use LWP::UserAgent;
   use JSON;
  use CGI qw/escape/;
  use HTML::DOM;

  open(my $l, 'locations2.txt') or die "Can't open locations: $!";

 while (my $line = <$l>) {
    chomp $line;
     my %args;
     @args{qw/givenname surname birth_place birth_year gender race/} = split /,/, $line;
     $args{birth_year} = ($args{birth_year} - 2) . '-' . ($args{birth_year} + 2);
      my $mech = WWW::Mechanize::Firefox->new(create => 1, activate => 1);
     $mech->get("https://familysearch.org/search/collection/index#count=20&query=%2Bgivenname%3A$args{givenname}20%2Bsurname%3A$args{surname}20%2Bbirth_place%3A$args{birth_place}%20%2Bbirth_year%3A1910-1914~%20%2Bgender%3A$args{gender}20%2Brace%3A$args{race}&collection_id=2000219");

Например

Ввод:

Benjamin,Schuvlein,Germany,1912,M,White

Желаемый URL:

https://familysearch.org/search/collection/index#count=20&query=%2Bgivenname%3ABenjamin%20%2Bsurname%3ASchuvlein%20%2Bbirth_place%3AГермания%20%2Bbirth_year%3A1910-1914~%20%2Bgender%3AM%20%2Brace%3AWhite&collection_id=2000219


person user1690130    schedule 10.02.2013    source источник
comment
Я не совсем понимаю. Можете ли вы показать входные данные и ожидаемый результат?   -  person    schedule 12.02.2013
comment
@depesz отличный вопрос! Просто добавил уточнение. Пожалуйста, дайте мне знать, если у вас есть дополнительные вопросы.   -  person user1690130    schedule 12.02.2013
comment
Есть ли в этом что-то большее, чем создание URL-адреса с помощью sprintf, где вы помещаете ...%d-%d... и используете $args{birth_year} - 2 для первого заполнителя и $args{birth_year} + 2 в второй?   -  person David M    schedule 12.02.2013
comment
Я не совсем понимаю, в чем у вас проблема. У вас есть значение в переменной. Вы также заменяете переменные уже в вызове $mech-›get(), так чего же именно не хватает?   -  person    schedule 12.02.2013
comment
@DavidM Я написал что-то на этот счет. Не так ли? Я не уверен, как поместить это в URL-адрес.   -  person user1690130    schedule 12.02.2013
comment
@depesz Проблема в том, что я не знаю, как поместить ввод в URL-адрес, когда он из строки, которую я делю на 2+ переменные, особенно когда 1 переменная должна быть разделена дальше.   -  person user1690130    schedule 12.02.2013
comment
У вас куча ошибок в строке $mech-›get, например: $args{givenname}20 не содержит знака процента перед 20.   -  person Myforwik    schedule 19.02.2013


Ответы (3)


Почему бы вам просто не изменить эту строку:

$mech->get("https://familysearch.org/search/collection/index#count=20&query=%2Bgivenname%3A$args{givenname}20%2Bsurname%3A$args{surname}20%2Bbirth_place%3A$args{birth_place}%20%2Bbirth_year%3A1910-1914~%20%2Bgender%3A$args{gender}20%2Brace%3A$args{race}&collection_id=2000219");

к этому:

$mech->get("https://familysearch.org/search/collection/index#count=20&query=%2Bgivenname%3A$args{givenname}20%2Bsurname%3A$args{surname}20%2Bbirth_place%3A$args{birth_place}%20%2Bbirth_year%3A$args(birth_year)~%20%2Bgender%3A$args{gender}20%2Brace%3A$args{race}&collection_id=2000219");

ПРИМЕЧАНИЕ. я изменил этот бит:

%3A1910-1914~%20

к этому:

%3A$arg(birth_year)~%20
person slm    schedule 12.02.2013

Один из способов сделать это:

file content:
link1
link2
...
linkn

use Data::Dumper;
use strict;
use warnings;

local $/=undef;
open(FILE,'<',$filename) or die $filename;
my $i = 1;
while (my $line = <FILE>){
  chomp($line);
  print "line: $line\n";
  my $tempfile = './$i.html';$i++;
  $mech->get( $line, ':content_file' => $tempfile, synchronize => 1 );
}
person user1126070    schedule 11.02.2013
comment
Что именно вы имеете в виду? Мне не ясно, как работает этот код или его цель. - person user1690130; 11.02.2013
comment
Он извлечет и сохранит каждую ссылку для дальнейшего анализа. - person user1126070; 11.02.2013
comment
Спасибо. этот поток посвящен загрузке данных для ссылки из .txt. - person user1690130; 11.02.2013

В этом ответе не учитывается, должны ли данные во входных данных быть закодированы в URL-адресе, то есть где-то по пути, если фамилия «фон Штупп», она должна стать «фон% 20Штупп»

Я не проверял это, так что может быть опечатка или незначительная ошибка. Тем не менее, это подход, который я бы использовал. Мой ответ также предполагает, что вам все равно, в каком порядке появляются критерии поиска.

my %query_params = (
    givenname => $args{givenname},
    surname   => $args{surname},
    birth_place => $args{birth_place},
    birth_year => sprintf("%d-%d", $args{birth_year} - 2, $args{birth_year} + 2),
    gender     => $args{gender},
    race       => $args{race},
);
my $query_parameter = join '%20',
                      map { "%2B$_%3A$query_params{$_}" }
                      keys %query_params;
my $url = "https//familysearch.org/search/collection/index#count=20&query=" .
          $query_parameter . "&collection_id=2000219";
person David M    schedule 12.02.2013
comment
Я посмотрю на это прямо сейчас. Должен сказать, что на данный момент я не беспокоюсь о пространстве, но есть над чем подумать. - person user1690130; 12.02.2013
comment
Я реализовал это неправильно? Я получаю сообщение об ошибке: Аргумент 1910-1914 не является числовым при вычитании (-) - person user1690130; 12.02.2013