-5

編集:以前に == の代わりに eq を使用しようとしましたが、機能しませんでした。どういうわけか今はそうです。その時点で別のエラーが発生して動作が妨げられた可能性がありますが、現在は解決されています。ありがとうございました。

私はいくつかの簡単な検証をしようとしています。変数を介して供給されるリダイレクト URL が特定のサイトで始まるかどうかを確認したい。存在する場合はリダイレクトが通過し、そうでない場合はサイトのルートにリダイレクトされます。かなり簡単に見えますよね?

$redir = $input{'redirect'};
$redir_sub = substr($redir, 0, 21);
if ($redir_sub == "http://www.mysite.com") {
     print "Location: $redir \n\n";
}else{
     print "Location: http://www.mysite.com \n\n";
}

問題は、そこにどの変数を配置しても、「if」が true を返すことです。お気に入りのウェブコミックをそこに置くと、文字列が一致しないにもかかわらず、そこにリダイレクトされます。たとえば、次のようになります。

$redir = $input{'redirect'};
$redir_sub = "http://www.yahoo.com"
if ($redir_sub == "http://www.mysite.com") {
     print "Location: $redir_sub \n\n";
}else{
     print "Location: http://www.mysite.com \n\n";
}

yahoo! にリダイレクトされます。何が起こっている?

4

5 に答える 5

2

あなたの問題は、あなたが使用していないことです

use warnings;

これが、Perl がこの間違いを許容している理由です。数値等価演算子を使用して文字列を比較しています。したがって、Perl は最初に各パラメータを数値に変換しようとします。また、文字列は数字で始まっていない (そして数字のように見えない) ため、ゼロに変換されます0。したがって、あなたの表現

if ($redir_sub == "http://www.mysite.com")

本当はこういう意味

if (0 == 0)

もちろん、これは常に true を返します。

警告を使用していた場合は、次のエラーが表示されます。

Argument "http..." isn't numeric in numeric eq (==) at ...
Argument "http..." isn't numeric in numeric eq (==) at ...

これは、文字列を比較するeqのではなく、使用する必要がある問題に関するヒントでした。==

于 2013-06-10T17:32:35.273 に答える
2

TL;DR: 使用しeqないで==ください!


言語としての Perl には問題があるようです。文字列や数値など、多くの異なるものに同じデータ型 (スカラー) を使用します。スカラーは、それらの 1 つだけではなく、同時に両方です。Perl には型注釈がなく、変数が文字列を保持しているか数値を保持しているかを示す方法がありません。

これは、等価テストを検討するときに問題を引き起こします。2 つのスカラー$a = "42.0"と を仮定し$b = 42ます。それらは等しいですか?はいといいえ:

  • "42""42.0"別物!これらは等しくありません。
  • 42との数42.0が等しい!

上で示したように、Perl はこのあいまいさを解決するために型システムを使用しません。代わりに、文字列演算と数値演算に異なる演算子のセットを使用します。

eq ne lt le gt ge cmp
== != <  <= >  >= <=> 
于 2013-06-10T17:27:04.440 に答える