2016-04-02 14 views
1

ハッシュと$dbhをサブsave2dbに渡したいとします。ただし、次のコード行の後にOdd number of elements in hash assignment in file2.pmというエラーメッセージが表示されます。my (%resultHash, $dbh) = (@_);。誰かがこのエラーの原因を私に説明してもらえますか?前もって感謝します!奇数サブルーチンパラメータのハッシュ割り当ての要素数

file1.pl

my $dbh_global = connect2db(); 
my %hash; ##Assume there are nothing wrong with the hash and it is populated 

foreach my $fileName_input (@ARGV){ 
    NVD::save2db(%hash, $dbh_global); 
} 

sub connect2db{ 
    my $driver = "mysql"; 
    my $database = "test"; 
    my $dsn = "DBI:$driver:database=$database"; 
    my $userid = "root"; 
    my $password = ""; 

    my $dbh = DBI->connect($dsn, $userid, $password) or die $DBI::errstr; 

    return $dbh; 
} 

file2.pm

sub save2db{ 

    my (%resultHash, $dbh) = (@_); # <-Error message occured 

    foreach my $resultHash_entry (keys %resultHash){ 
     my $a= $resultHash{$resultHash_entry}{'a'}; 
     my $b= $resultHash{$resultHash_entry}{'b'}; 
     my $c= $resultHash{$resultHash_entry}{'c'}; 
     my $d= $resultHash{$resultHash_entry}{'d'}; 

     my $insert_sql = $dbh -> prepare("INSERT INTO `test`.`record` 
             (`a`, `b`, `c`, `d`) 
             VALUES 
             (?, ?, ?, ?)"); 

     $insert_sql->execute($a, $b, $c, $d) or die $DBI::errstr; 
    } 

} 

答えて

2

Odd number of elements in hash assignmentは、エラーが、警告ではありません。 値がサブルーチンに渡されると、値は一緒にフラット化されるため、問題が発生します。

%hash = ("a"=>1,"b"=>2); 

$dbh_global = "abc"

のためのいくつかのデータは、その後、あなたが

NVD::save2db(%hash, $dbh_global); #the problem is here. 

ハッシュはいつもとキーを持つことになり、サブルーチンに値を渡してきた私たちは、あなたのハッシュを考えてみましょう値。したがって、すべてのハッシュは偶数のデータしか持たないでしょう。

あなたのような、

my (%resultHash, $dbh) = (@_); 

ので%resultHashが不均一な値、3つのキーと、この

{ 
    a=>1, 
    b=>2, 
    abc   #This is the reason of the warning. 
} 

のような2つの値を含んでおり、その後$dbhますサブルーチンに値を取得するにはそれで値を持ちません。

ので

NVD::save2db($dbh_global, %hash); 

として行を変更し、それに行うための

my ($dbh,%resultHash) = (@_); 

さも

使用のハッシュリファレンスのようなサブルーチンに値を取得します。

my $resulthash_ref = \%resultHash; #Hash reference 

NVD::save2db($resulthash_ref, $dbh_global); 


#inside the subroutine 
{ 
    my ($hash_ref,$dbh) = (@_); 
    my %hash = %{$hash}; #Dereference the hash 
} 
+0

こんにちはmkHun、あなたの説明と解決に感謝します。 – SL07

関連する問題