2017-12-22 22 views
-2

URLからいくつかの変数をロードし、CGIスクリプトが初期化されているかどうかチェックします。私はすぐにPerlのリストに初期化されていない値を入れることができないことを知りました。リスト内の初期化されていない値の使用

私のアプローチは、単純にリストを反復し、スイッチ変数$sucessDOM(すべてのデータが初期化されていれば1、他の場所では0)を使用することでした。

私はこの思い付いた:

### Read data from HTML 
my $mailinglist = param('mailinglist'); 
my $firstname = param('firstname'); 
my $lastname = param('lastname'); 
my $mail  = param('mail'); 

my $sucessDOM = 0; 

my @DOM = { $mailinglist, $firstname, $lastname, $mail }; 

### Data validation 
for my $data (@DOM) { 

    if ($data eq undef) { 
     $sucessDOM = $sucessDOM + 1; 
    } 

    if ($sucessDOM = @DOM) { 
     print "@DOM\n"; 
     $sucessDOM = 1; 
    } 
    else { 
     $sucessDOM = 0; 
    } 
} 

私はまた、彼らはすべて初期化されていない場合のみ、二つの値についてのエラーが配列であるされている理由を理解することはできません

[Fri Dec 22 20:30:40 2017] read_form.cgi: Use of uninitialized value $mailinglist in anonymous hash ({}) at ./read_form.cgi line 20. 
[Fri Dec 22 20:30:40 2017] read_form.cgi: Use of uninitialized value $lastname in anonymous hash ({}) at ./read_form.cgi line 20. 
[Fri Dec 22 20:30:40 2017] read_form.cgi: Use of uninitialized value in string eq at ./read_form.cgi line 24. 
HASH(0x55c8a73eeea8) 

を次のように出力されます私が直接値を渡さずにスクリプトを実行するように。

+0

'私の$ successDOM =はgrep {定義された($ _)!} $メーリングリストは、$ FIRSTNAME、$の姓、$メール;'! – ikegami

答えて

3

あなたはあなたのコードと、少なくとも4つの問題があります。

まず、{}は、無名ハッシュを作成し、それへの参照を返します。これは@DOMで終わる単一の値です。警告は、ハッシュキーが文字列でなければならないことと、それらがundefであるかどうかを警告するためです。あなたはeqは、文字列を比較し、同様

my @DOM = ($mailinglist, $firstname, $lastname, $mail); 

セカンドを割り当てるべきであるので、''undefを変換します。すべての配列要素が内側(つまり、ループの最後の繰り返しが、いずれにも当てはまらないだろう)forループ成功した場合

if (! defined $data) { 

サードを$データがundefのであれば、テストを行うには、チェックされています。 if ($successDOM...ブロックをforループの後に移動します。

第4に、=は単なる代入演算子です。数値比較のために==を使用します。

if ($successDOM == @DOM) { 
関連する問題