2011-07-21 22 views
2

私はPerlに少し慣れていて、Hash of Arraysをモジュール間で移動することについて助けが必要です。Perl - モジュール間での配列のハッシュ

現在、私はそうのような配列を格納DBモジュールがあります。

sub getSourceCriteria { 

    my($self) = shift(); 
    my($sourceId) = shift(); 
    chomp $sourceId; 

    my(%criteria) =(); 
    $logger->debug("Getting records for Source ID: " . $sourceId); 
    $dbh=DBI->connect('dbi:ODBC:StkSkrnDB', 'RTETET', 'XXuser01',{ RaiseError => 1, AutoCommit => 0 }) || \ 
       $logger->err_die("Database connection not made: $DBI::errstr\n"); 

    my($sth) = "select a.criteria_id, a.criteria_type, a.criteria_props,a.generalcriteria_id,b.field_id "; 
    $sth = $sth . "from t_criteria a, t_sourceMapping b where a.generalcriteria_id = (select generalcriteria_id from t_sourcecriteria where source_id =?) "; 
    $sth = $sth . "and a.criteria_id=b.criteria_id"; 


    my($qry) = $dbh->prepare($sth); 
    $qry->execute($sourceId) || $logger->error("Could not query for Source Criteria: $DBI::errstr\n"); 
    my(@row)=(); 
    my($tempCount) = 0; 

    while (@row = $qry->fetchrow_array) { 
     $tempCount = scalar @row; 
     $logger->debug("Size of retrieved SQL Array : $tempCount"); 
     $criteria{$row[0]} = \@row; 
     ##@{$criteria{$row[0]} } = \@row; 


    } 

    return %criteria; 
} 

を私は上記のコードからSQLの出力を読み込み、別々のperlスクリプトがあります。

foreach my $criteria (keys %criterias) { 
     @temp = exists($criterias{$criteria}) ? @{ $criterias{$criteria} } :(); 
     ##my $tempStr = exists($criterias{$criteria}) ? "Yes" : "No"; 
     $arraySize = scalar @temp; 
     $logger->debug("GENERALCRITERIA_ID is $GENERALCRITERIA_ID and size of array is $arraySize and $temp[0]"); 
     $genCrit_ID = $temp[$GENERALCRITERIA_ID]; 
     $logger->debug("Criteria ID $criteria has Gen Criteria ID $genCrit_ID"); 
     if (0!=$generalCriteria_ID || $generalCriteria_ID != $genCrit_ID) { ## test for uniqueness 
      $generalCriteria_ID = -1; 
     } 
     else { 
      $generalCriteria_ID = $genCrit_ID; 
     } 
    }# do something with $key and $value 
    $generalCriteria = $generalCriteria_ID; 

} 

問題を私は0を取得した配列のサイズ(2番目のスニペット)として取得していますが、配列を格納すると(1番目のスニペットで)、実際の配列のサイズを調べて取得します。

お願い/ご意見をいただければ幸いです。

EDIT DBインターフェイスコードにさらにコードを追加しました。

+2

読者に明らかな説明がないまま大きなコードの真ん中からコードが抜け落ちることは、あなたの問題を示す素晴らしい方法ではありません。この問題を明らかにする最小限ではっきりした*自己完結型*(=実行可能な)サンプルを考え出すべきです。それを作ることを試みることはあなた自身の問題を解決することはありそうもありません。 – Lumi

+0

私は正直なところ、抽出したコードの断片が、エラーを促すPerl言語に関する私の馴染みがないことを確信しているので、答えを推論するのに十分であると感じました。私は、分析を助けるためのコードを追加していきたいと思います。 –

+0

注意「極小」ではなく「極小」と書いています。 :-)真剣に、このアドバイスを聞いてみてください、あなたは解決策を自分で見つけるでしょう。すでに何千倍も私を助けてくれました。問題を明らかにする最小の例。 – Lumi

答えて

3

whileループでは、@rowに割り当てて、その配列への参照を格納しています。ただし、ループが繰り返されるたびに、新しい配列を宣言することなく@rowの内容を置き換えます。だから最後に、それぞれの参照は同じものを指しています。ここにあなたのコードで

my(@row)=(); 
my($tempCount) = 0; 

while (@row = $qry->fetchrow_array) { 
    $tempCount = scalar @row; 
    $logger->debug("Size of retrieved SQL Array : $tempCount"); 
    $criteria{$row[0]} = \@row; 
    ##@{$criteria{$row[0]} } = \@row; 
} 

たびwhileループの反復処理し、あなたは@row配列に新しい値を割り当てます。しかし、my(@row)=();行はループの外側で発生するため、@row配列は常に同じです。したがって、配列に割り当てるたびに、既に取ったすべての参照に格納されているものを変更しています。

問題を解決するには、繰り返しごとに新しい配列を宣言する必要があります。これを実行する最も簡単な方法は、while条件に宣言を移動することです:

my($tempCount) = 0; 

while (my @row = $qry->fetchrow_array) { 
    $tempCount = scalar @row; 
    $logger->debug("Size of retrieved SQL Array : $tempCount"); 
    $criteria{$row[0]} = \@row; 
    ##@{$criteria{$row[0]} } = \@row; 
} 

今すぐたび、あなたは新しい配列への参照を取得します \@row参照してください。


あなた$qry->fetchrow_array方法は、配列リファレンスを返した場合、あなたは問題がなかったとします:

my $row; 
while ($row = $qry->fetchrow_array) { 
    $logger->debug("Size of retrieved SQL Array : "[email protected]$row); 
    $criteria{$$row[0]} = $row; # already a reference 
} 

をしかし、小さなスコープを維持することであるので、私はまだ、自分のコードでwhile (my $row = ...としてそれを記述します良いこと。

+0

信じられないかもしれませんが、私はファイルのためのプラグマを追加しました(いくつかの以前の脚の射撃の後)、それでも問題は解決しません。最初のコードスニペットのコードスニペット全体を追加して、私が達成しようとしていることのより良いアイデアを得ました。 –

+0

こんにちは、ありがとうございました。コードスニペットを使用して追加の説明に感謝します。 –

+0

簡単な質問:なぜwhile(@row = $ qry-> fetchrow_array)は配列を再初期化しませんでしたか?私はこの文が 'fetchrow_array'関数によって新しい参照を与えられると想像しました。助けてくれてありがとう。 –

関連する問題