2016-04-02 4 views
1

Ich möchte einen Hash und $dbh an meine Sub-save2db übergeben. Ich erhalte jedoch eine Fehlermeldung: Odd number of elements in hash assignment in file2.pm nach dieser Codezeile: my (%resultHash, $dbh) = (@_);. Kann mir bitte jemand die Ursache dieses Fehlers erklären. Danke im Voraus!Odd Anzahl der Elemente in der Hash-Zuweisung im Subroutinenparameter

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; 
    } 

} 

Antwort

2

Odd number of elements in hash assignment ist kein Fehler, sondern eine Warnung. Das Problem tritt auf, wenn die Werte an das Unterprogramm übergeben werden, werden die Werte zusammen geglättet.

Betrachten wir Ihre Hash für einige Daten haben Beispiel

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

und $dbh_global = "abc"

Dann Sie den Wert in das Unterprogramm übergeben

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

Hash wird immer einen Schlüssel mit Wert. Jeder Hash erhält also nur gerade Daten.

abrufen Sie den Wert in die Unterroutine wie

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

So wird %resultHash uneben Werte enthalten, drei Tasten und zwei Werte wie diese

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

und dann hat $dbh kein Wert darin.

zu ändern, um die Linie als

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

und die Werte in Unterprogramm abrufen wie

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

Oder

Verwendung Hashreferenz, um es zu tun.

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

Hallo mkHun, danke für deine Erklärung und Lösung. – SL07

Verwandte Themen