Perl для начинающих - PullRequest
       1

Perl для начинающих

3 голосов
/ 24 июня 2011

так что у меня есть это:

for $i (0..@parsedText) {
if ($parsedText[$i] =~ /\s{20}<a href/) {

    my $eventID = $parsedText[$i];
    my $eventLink = $parsedText[$i];
    my $event_id_title = $parsedText[$i];

    $eventID =~ s/[\s\S]*?id=(\d+).*\n/$1/;
    $eventLink =~ s/[\s\S]*?'(.*?)'.*/$1/;
    $event_id_title =~ s/\s+<a[\s\S]*?>([^<]*).*\n/$1/;
    };
};

но по какой-то причине, если я распечатаю какое-либо из них, он возвращает исходное значение вместо замены строки, которую я ХОЧУ, чтобы вернуть.

Спасибо за вашу помощь

Ответы [ 2 ]

5 голосов
/ 24 июня 2011

Вы получаете то же самое, что и out, потому что первая часть вашего матча не совпадает, поэтому замена не выполняется.

Я предполагаю (так как не было введено никаких данных), что в вашем массиве parsedText нет новых строк. Вот немного более чистый способ написания того, что вы сделали выше:

foreach ( @parsedText ) {
  if (/\s{20}<a href/) {

    ( my $eventID = $_ )        =~ s/.*?id=(\d+).*/$1/;
    ( my $eventLink = $_ )      =~ s/.*?'(.*?)'.*/$1/;
    ( my $event_id_title = $_ ) =~ s/\s+<a.*?>(.*?)<.*/$1/;

    print "$eventID, $eventLink, $event_id_title\n";
  }
}

Как правило, вам следует избегать синтаксического анализа HTML, подобного этому, и вместо этого использовать годы собранной мудрости, равной http://cpan.org, и использовать HTML :: Parser, HTML :: Parser :: Simple или HTML :: TreeBuilder.

0 голосов
/ 24 июня 2011

Это работает ...

my $eventID = $parsedText[$i];
my $eventLink = $parsedText[$i];
my $event_id_title = $parsedText[$i];

$eventID =~ s/.*id=['"]?(\d+)['"]?.*/$1/;
$eventLink =~ s/^.+a\s+href\s*=\s*(['"])([^\1]+)\1.*/$2/;
$event_id_title =~ s/\s+<a.*?>([^<]*).*/$1/;

print "$eventID\n";
print "$eventLink\n";
print "$event_id_title\n";

Регулярные выражения могут быть хитрыми. Лучше всего создавать тестовую программу и тестировать их постепенно, пока не получите желаемое. Помните, что в HTML можно использовать одинарные или двойные кавычки, а URL-адреса могут содержать кавычки. И идентификаторы не обязательно должны быть числовыми (хотя я сохранил их здесь).

'\ 1' в $eventLink обозначает либо одинарную, либо двойную кавычку. Поскольку это часть регулярного выражения, вам нужно поставить обратную косую черту перед числом, а не знак доллара.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...