0

我试图在 URL 获取请求期间识别两个字符串之间的差异(使用 LWP::Simple)。
我有一个 URL,比如http://www.example.com?param1=x¶m2=y¶m3=z
我确保所有空白输入也得到处理,但此时这无关紧要,因为我要确保所有参数完全一样。
此外,硬编码的 URL 是从生成的 URL 复制和粘贴的。
当我执行以下操作时,此 URL 有效:

my $url = "http://www.example.com?param1=x&param2=y&param3=z";
my $content = get($url);

然而,当我从用户提供的参数构建 URL 时,get 请求不起作用(错误:来自站点的 500)。
我通过打印出来比较了这两个 URL,发现差异为零。我已经尝试删除所有潜在的隐形字符。

生成的代码和静态字符串的输出,假设用户输入与静态字符串相同(这是我要确保做的):

http://www.example.com?param1=x&param2=y&param3=z
http://www.example.com?param1=x&param2=y&param3=z

我假设打印输出会删除我看不到的字符。我还遵循了http://www.perlmonks.org/?node_id=882590上的解决方案,它指出了差异,但我不知道为什么,考虑到我根本看不到。
有没有人遇到过这个问题?如果我需要澄清任何事情或需要提供其他信息,请告诉我。




编辑:问题和解决方案
因此,在使用 mob 的建议来识别差异之后,我发现生成的 URL 中有一个空字符,它没有在输出中打印出来。即:
http://www.example.com?param1=x&param2=y&param3=z实际上是
http://www.example.com?param1=x&param2=y&param3=\000z
我使用了一个简单的正则表达式:$url =~ s/\000//g;删除该(和任何其他)空值。

4

2 回答 2

2

显然,您构建的字符串与硬编码的字符串不同。如果你写这样的代码

my $ss = 'http://www.example.com?param1=x&param2=y&param3=z';
print join(' ', map " $_", $ss =~ /./g), "\n";
print join(' ', map sprintf('%02X', ord), $ss =~ /./g), "\n";

那么你就可以看到字符串中每个字符的十六进制值,并且可以更准确地比较它们两个。例如,上面的代码输出

 h  t  t  p  :  /  /  w  w  w  .  e  x  a  m  p  l  e  .  c  o  m  ?  p  a  r  a  m  1  =  x  &  p  a  r  a  m  2  =  y  &  p  a  r  a  m  3  =  z
68 74 74 70 3A 2F 2F 77 77 77 2E 65 78 61 6D 70 6C 65 2E 63 6F 6D 3F 70 61 72 61 6D 31 3D 78 26 70 61 72 61 6D 32 3D 79 26 70 61 72 61 6D 33 3D 7A
于 2013-01-10T19:53:24.163 回答
2

使用数据序列化函数来检查字符串中的隐藏字符。

$url1 = "http://www.example.com?param1=x&param2=y";
$url2 = "http://www.example.com?param1=x&param2=y\0";
$url3 = "http://www.example.com?param1=x&param2=y\n";

use JSON;
print JSON->new->pretty(1)->encode( [$url1,$url2,$url3] );
# Result:
# [
#   "http://www.example.com?param1=x&param2=y",
#   "http://www.example.com?param1=x&param2=y\u0000",
#   "http://www.example.com?param1=x&param2=y\n"
# ]


use Data::Dumper;
$Data::Dumper::Useqq = 1;
print Dumper($url1,$url2,$url3);
# Result:
# $VAR1 = "http://www.example.com?param1=x&param2=y";
# $VAR2 = "http://www.example.com?param1=x&param2=y\0";
# $VAR3 = "http://www.example.com?param1=x&param2=y\n";
于 2013-01-10T19:55:38.687 回答