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

Gre*_*her 0 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"; 
Run Code Online (Sandbox Code Playgroud)

更新:我将此脚本称为:

perl bork_youtube_channel.pl 'http://www.youtube.com/user/pennsays'
Run Code Online (Sandbox Code Playgroud)

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

更新:事实证明,URL毕竟是双重编码的.感谢大家的帮助!

Jon*_*eet 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";
Run Code Online (Sandbox Code Playgroud)

这打印

a&b
a&b
Run Code Online (Sandbox Code Playgroud)

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

你确定你的原始文本不是foo&amp;amp;bar吗?这会产生输出

foo&amp;bar
foo&bar
Run Code Online (Sandbox Code Playgroud)

用上面的代码.

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