0

URL取得リクエスト中に2つの文字列の違いを識別しようとしています(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)。
2つの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;、その(およびその他の)null値を削除しました。

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";

そうすれば、文字列内の各文字の16進値を確認でき、2つをより正確に比較できます。たとえば、上記のコードは出力します

 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 に答える