1

Perl CGI モジュールの使用に関する質問:

次のように定義された 2 つのパラメーターを受け入れる foo というサブルーチンがあるとします。

sub foo {
   local($a, $b) = @_;
   print "a= [$a]";
}

私のメイン ルーチンでは、いくつかのフォーム パラメータを取得し、次のように foo に渡します。

use CGI;
$cgi = CGI->new;
foo($cgi->param('field1'), $cgi->param('field2'));

フォームが field1 の値を渡さなかった場合 (私の場合、選択する値のない field1 という名前の SELECT フィールドが使用されました)、サブ foo は $a を $cgi->param で渡された値に設定します('field2')、これは空でない値でした。

なぜこれが起こるのか、なぜ $a が単なる空白 ('') 値ではなく、$b = $cgi->param('field2') から送信された値なのかを理解するのを手伝ってもらえますか?

論理的な理由があると確信していますが、私は Perl のプロではないので、Perl についてまだ学んだり理解したりしていないことは確かです。

前もって感謝します!

4

1 に答える 1

3

CGIparam()関数は、リスト コンテキストまたはスカラー コンテキストで呼び出された場合、動作が異なります。スカラー コンテキストでは、最初の (そして最も唯一の) パラメータ値が返されます。リスト コンテキストでは、すべてのパラメータ値が返されます (CGI ではキーごとに複数の値を使用できることに注意してください)。

このように関数を呼び出すと、リスト コンテキストが使用されます。これは$cgi->param('field1')、 が空のリストに評価され、 の最初の値がサブルーチンで$cgi->param('field2')割り当てられることを意味します。$aこれを回避するには、スカラー コンテキストを明示的に強制する必要があります。これは、次を使用して実行できますscalar

foo(scalar($cgi->param('field1')), scalar($cgi->param('field2')));

別の可能性は、中間変数を使用することです。

my $field1 = $cgi->param('field1'); # scalar context here
my $field2 = $cgi->param('field2');
foo($field1, $field2);
于 2013-09-07T06:51:25.793 に答える