2011-08-08 78 views
2

我正在寫這個代碼在Perl中,我創建一個唯一的關鍵,然後給它分配一個值。參考發現在哪裏,甚至大小的列表

sub populate { 
     my $file = shift; 
     my %HoH = shift; 

     open(INFILE,$file); 
     . 
     . 
     . 
     $final_name = $prepend.$five; 
     $HoH{$final_name} = $seven; 
} 

現在我傳遞兩個參數的子程序,類似的

&populate(\%abc,$file_1); 
&populate(\%xyz,$file_2); 

ID它爲什麼給我這樣的錯誤:

Reference found where even-sized list expected 
+3

無論你正在閱讀什麼文檔,告訴你使用雙參數形式的「open」是過時的。使用三參數形式:「打開我的$ INFILE」,<',$ file'。 (並檢查錯誤。) –

+0

但是$文件包含文件位置的地址。 – kunal

+1

我不確定你的意思。 '$ file'應該包含文件的*名稱*。調用'open(INFILE,$ file)'和'打開我的$ INFILE','',$ file'幾乎是等價的,但後者更好。 'perldoc -f open'獲取更多信息。 (你在源文件中缺少'$';'my file = shift;'應該是'my $ file = shift;'。) –

回答

11

因爲你的哈希值分配給一個引用,而不是一個散列(偶數列表)。你需要做的:

my $hashref = shift; 

... 

$hashref->{$final_name} = $seven; 

ETA:你應該調用子程序,無需&,例如populate(...),除非你特別想重寫sub的原型。如果你不知道原型是什麼,只是不要使用&

ETA2:你真的應該使用一個詞法文件句柄和三個參數打開。考慮這種情況:

open INFILE, $file; 
some_sub(); 
$args = <INFILE>; # <--- Now reading from a closed filehandle 

sub some_sub { 
    open INFILE, $some_file; 
    random code... 
    close INFILE; 
} 
+0

謝謝。因此,我已將散列正確傳遞給子例程並填充(\%abc,$ file_1) – kunal

+0

嗯,不,因爲您正在爲該文件分配'\%abc',並且將'$ file_1'分配給散列。 – TLP

+0

它給了我一個錯誤,說在open.I打開使用未初始化的值(,$文件) – kunal