Почему этот оператор while бесконечный цикл? - PullRequest
1 голос
/ 17 января 2011

Я хочу напечатать некоторые даты с сайта со структурой, подобной этой:

<tr><td><b><a href="/calendar.*?=\w+">(.*?)</a></b></td>
    <td align=".*?"/date/(\d+)-(\d+)/">.*?</a> <a href="/year/\d+/">(\d+)</a></td>
    <td>(.*?)*</td></tr>

и т.д.

my $country = $1;
my $month   = $2;
my $day     = $3;
my $year    = $4;
my $event   = $5;

Мне нужно извлечь только те, где $country - это «США», но если я использую оператор while, код будет бесконечно повторяться в течение первого совпадения. Как переработать скрипт для извлечения каждой найденной даты в США?

sub getSpec {
    my $line = shift;
    my $site = getSite($line);
    while ($site =~ s/.../) {
        my $country = $1;
        my $month   = $2;
        my $day     = $3;
        my $year    = $4;
        my $event   = $5;
        if ($country =~ /USA/i) {
            print $month.$date.$year.$country.$event."\n";
        }
    }
}

Ответы [ 2 ]

1 голос
/ 17 января 2011

Глобальное соответствие должно быть для вас:

   while ($site =~ m/.../g) {

Подробнее см. В документации .

0 голосов
/ 17 января 2011

Похоже, вы не меняете строку после первого совпадения. Попробуйте читать $ site (это html всего сайта, верно?) Построчно, чтобы цикл выглядел так (мой Perl немного ржавый, это всего лишь грубый набросок, извините за это):

while ( $_ = another_line_from_$site)
{
   if($_ =~ s/.../) {
    {variables}
     if($country =~ /USA/i) 
       { other_stuff }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...