2

関数にいくつかの引数を渡していますが、そのうちの1つは未定義である可能性があります。

$a = ($config->function(param('a'),'int'));

私のモジュールには、次のような関数が含まれています。

sub function{                    
        my $self = $_[0];           
        my $t = $_[1];              
        my $type = $_[2];           
        print "$self,$t,$type<br/>";
}

構文shiftの代わりに試してみましたが、変更はありません。@_問題は$config->function、未定義param('a')で呼び出された場合、次のように出力されることです。

MY_FUNC=HASH(0x206e9e0),name,あるべき$t値に設定されている ようで、完全に無視されています。$typeundef

4

3 に答える 3

4

undefパラメータリストで完全に有効です。ここでの問題は、param関数がではなく空のリストを返すことだと思いundefます。

sub function {
    no warnings 'uninitialized';
    print join "/", @_;
}

function(undef,"foo");      #   outputs "/foo"
function((), "foo");        #   outputs "foo"

の引数リストでfunctionは、 param関数はリストコンテキストで評価されます。

sub param1 {
    return;     # undef in scalar context, but empty list in list context
}

sub param2 {
    return undef;    # scalar ctx: undef, list ctx: list with one undef elem
}

function(param1(), "foo");    #   param1() -> () ... outputs "foo"
function(param2(), "foo");    #   param2() -> (undef) ... outputs "/foo"

param回避策は、関数がスカラーコンテキストで評価されることを確認することです。

function(scalar param1(), "foo");    # now outputs "/foo"

実際にreturn undefPerlサブルーチンで言うことは、コードの臭いと見なされる人もいることに注意してください。

于 2012-08-23T16:03:16.057 に答える
3

エラーが発生した場合、 CGIparamメソッドは空のリストを正しく返します。これはPerlのサブルーチンとメソッドの標準的な動作であり、erorrの場合にfalse値を返します。

@mobが言うように、明示return undefはリストコンテキストで1要素のリストを返すという理由だけで間違っています。これは真の値であり、成功を意味します。変更された場合、多くのコードが破損します。

あなたがする必要があるのは、パラメータを個別に抽出するようにコードを変更することです

my $param = param('a');
$config->function($param, 'int'));

または、呼び出しをパラメータリストに入れたい場合は、次のように記述できます

$config->function(scalar param('a'), 'int'));

また

$config->function(param('a') // undef, 'int'));
于 2012-08-23T16:55:57.423 に答える
1

[コメントとして始めましたが、長すぎました]。

引数リスト内では、引数はリストコンテキストで評価されます。すでに2つの答えがそれを指摘していますが、彼らが話していた他のすべてのことについて、あなたはそれを見逃したと思います。

それを超えて、param少なくとも3つのケースを処理する必要があり、リンカーンが選択したインターフェイスは、時には煩わしいものですが、それらを処理するのに十分な方法です。

クエリパラメータaがまったく表示されない:

b=1

クエリパラメータaが表示されますが、値はありません。

a=&b=1

クエリパラメータaは次の値で表示されます。

a=1&b=1
于 2012-08-24T08:36:06.290 に答える