Мне не ясно из вашего вопроса и вашего кода, что вы пытаетесь извлечь из HTML. В частности, почему вы захватываете все перед основной частью матча, а затем игнорируете захват?
Мое предположение заключается в том, что вы хотите, чтобы все URL-адреса отображались в качестве параметров функции yt.preload.start
JavaScript. Вы можете сделать это так:
use strict;
use warnings;
use LWP::UserAgent;
use URI::Escape;
my $ua = LWP::UserAgent->new( agent => 'Mozilla/5.0 (Windows NT 5.1; rv:10.0.1) Gecko/20100101 Firefox/10.0.1');
my $html = $ua->get('http://www.youtube.com/watch?v=Ko0c4QT5aVA')->content;
my @urls = $html =~ /\Qyt.preload.start("\E(http[^"]+)/gi;
print map uri_unescape($_)."\n", @urls;
редактирование:
Это решение оставляет URL-адреса с символами JavaScript Unicode "\u0026"
, что совпадает с Perl "\N{N+0026}"
или амперсандом "&"
. Также строка начинается с "http:\/\/"
. Исправить это просто. Один из способов - заменить окончательный map
на
print map {
my $ss = uri_unescape $_;
$ss =~ s/\\u0026/&/g, $ss =~ s|\\/|/|g;
$ss;
} @urls;