初学者perl问题

时间:2011-06-23 21:09:58

标签: regex perl

所以我有这个:

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 个答案:

答案 0 :(得分:5)

因为匹配的第一部分不匹配所以你得到的相同,所以没有替换。

我的猜测是(因为没有显示任何输入)您的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。

答案 1 :(得分:0)

这有效......

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中可以包含引号。并且,ID不必是数字(虽然我在这里保留它)。

$eventLink中的'\ 1'引用单引号或双引号。由于它是正则表达式的一部分,因此您需要在数字前面加反斜杠而不是美元符号。