2016-04-02 29 views
1

alt yordam parametresindeki karma atamasındaki eleman sayısı save2db alt kısmına bir hash ve $dbh geçmek istiyorum. Ancak, şu hata kodu: my (%resultHash, $dbh) = (@_);: Odd number of elements in hash assignment in file2.pm hata iletisi alıyorum. Birisi bana bu hatanın nedenini açıklayabilir. Şimdiden teşekkürler!Tek Çift

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

} 

cevap

2

Odd number of elements in hash assignment bir hata ama bir uyarı değildir. Sorun, değerler altprograma iletildiğinde, değerler birlikte düzleştiğinden dolayı yükselir.

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

Hash hep birlikte bir anahtar olacak, bize karma

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

ve $dbh_global = "abc"

Sonra bir alt programa geçirme değeriyle örneğin bazı veriler var düşünelim değer. Yani her hash sadece veriye sahip olacak.

Eğer

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

Yani %resultHash bu

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

gibi dengesiz değerler, üç anahtarları ve iki değeri içerecektir ve daha sonra $dbh içinde hiçbir değer vardır, alt yordam gibi içine değerini almak.

yüzden

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

olarak çizgiyi değiştirin ve

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

Ya buna ne için başka

kullanım karma referans gibi bir alt programa değerleri almak.

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

Merhaba mkHun, açıklama ve çözümünüz için teşekkürler. – SL07

İlgili konular