初学者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/;
    };
};
但是由于某种原因,如果我打印其中任何一个,它将返回原始值,而不是我希望返回的字符串替换。 谢谢你的帮助     
已邀请:

bab

        您得到的结果与出局的结果相同,因为匹配的第一部分不匹配,因此没有替换。 我的猜测是(由于未显示任何输入)您的
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。     
        这有效...
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 \'引用单引号或双引号。由于它是正则表达式的一部分,因此您需要在数字前面加反斜杠,而不是美元符号。     

要回复问题请先登录注册