2

私は Perl の初心者で、この問題に悩まされています。

ログインを管理し、資格情報が正しい場合に index.cgi ページにリダイレクトする _login.cgi スクリプトがあります。

if (functions::check_credentials($input{"username"}, $input{"password"}) eq true ){

$session = new CGI::Session("driver:File", undef, {File::Spec->tmpdir});
$session->param("name", "Carcarlo Pravettoni");

$cookie = $page->cookie(CGISESSID => $session->id);
print $page->redirect( -URL => "index.cgi" -cookie=>$cookie);

} else {...}

しかし、正しい資格情報で試してみると、_login.cgi (このスクリプト自体) への無限のリダイレクト ループが発生します。

代わりに、リダイレクトで Cookie を送信しない場合、すべてが機能します。

if (functions::check_credentials($input{"username"}, $input{"password"}) eq true ){

$session = new CGI::Session("driver:File", undef, {File::Spec->tmpdir});
$session->param("name", "Carcarlo Pravettoni");

$cookie = $page->cookie(CGISESSID => $session->id);
print $page->redirect( -URL => "index.cgi");

} else {...}
4

2 に答える 2

4

ここにタイプミスがあります ( の後のカンマがありません"index.cgi"):

print $page->redirect( -URL => "index.cgi" -cookie=>$cookie);

strictおよびwarnings(場合によってdiagnosticsは ) を有効にして、エラー/警告がなくなるまでコードをリファクタリングすることをお勧めします。

于 2012-05-09T15:41:35.723 に答える
1
if (functions::check_credentials($input{"username"}, $input{"password"}) eq true )

use strictオンになっていない場合は、意図したとおりに誤って実行されている可能性があります。

Perl には Boolean プリミティブ型がないため、Perl はおそらくそれtrueを stringと解釈しています'true'。また、関数でも同じエラーが発生している可能性が高いcheck_credentialsため、2 つのエラーが互いに相殺されています。

より「Perlish」なアプローチは、必要に応じcheck_credentialsて true または false の値 (おそらく1and undef) を返し、ifステートメントが特定の値をチェックしないようにすることです。

if (functions::check_credentials($input{"username"}, $input{"password"})) { ... }
于 2012-05-09T16:10:32.267 に答える