为什么第一次更换没有任何影响?

时间:2009-06-28 17:00:37

标签: regex perl

我很可能在这里遗漏了一些明显的东西,但为什么我需要调用搜索/替换正则表达式两次才能在下面的代码中产生任何影响?如果我只打电话一次,则不会进行更换: - (

use strict;
use warnings;
use LWP::Simple;

my $youtubeCN = get(shift @ARGV);
die("Script tag not found!\n")
 unless $youtubeCN =~ /<script src="(.*?)">/;
my $youtubeScr = $1;
# WHY ???
$youtubeScr =~ s/&amp;/&/g;
$youtubeScr =~ s/&amp;/&/g;
my $gmodScr = get($youtubeScr);

$gmodScr =~ s/http:\/\/\?container/http:\/\/www.gmodules.com\/ig\/ifr\?/;
print "<script type=\"text/javascript\">$gmodScr</script>\n"; 

更新:我将此脚本称为:

perl bork_youtube_channel.pl 'http://www.youtube.com/user/pennsays'

如果放大器未正确转换为&amp;,我将在步骤2返回HTML页面(可能是错误页面)而不是Javascript。

更新:事实证明,网址毕竟是双重编码的。谢谢大家的帮助!

1 个答案:

答案 0 :(得分:7)

我怀疑如果你看一下输入数据,做正确的事 - 我的猜测是在编码和解码的过程中,你没有看到真正的输入和输出。例如,试试这个:

use strict;
use warnings;

my $youtubeScr = "a&amp;b";

$youtubeScr =~ s/&amp;/&/g;
print $youtubeScr;
print "\n";

$youtubeScr =~ s/&amp;/&/g;
print $youtubeScr;
print "\n";

打印

a&b
a&b

换句话说,它已经开始工作了。

您确定原始文字不是foo&amp;amp;bar吗?那会产生

的输出
foo&amp;bar
foo&bar

使用上面的代码。

PS我的perl-fu糟透了。对于上述代码中的任何语言滥用行为表示道歉,但我认为它应该仍然有用:)