2013-05-06 73 views
5

我正在嘗試在文件中寫入從數組中取得的某些值。但我有一些錯誤'不能使用一個未定義的變量在...行81中的符號引用:不能使用未定義的值作爲符號perl

foreach $k (sort keys %{$value2}){ 
    print $value4 $k." = ".%{$value2{$k}}. $value3; 



sub printit{ 
    $value1 = $_[0];#"ipadress" is a string 
    $value2 = $_[1];#%hash2 
    $value3 = $_[3];#"paquet" is a string 
    $value4 = $_[4];#SOURCE is the file name 

    foreach $k (sort keys %{$value2}){ 
    print $value4 $k." = ".%{$value2{$k}}. $value3; 
    if (%{$value2{$k}} >= 2) { print $value4 "s";} 
    print $value4 "\n"; 
    } 
} 

printit('ipadress', \%hash2, ' paquet'. SOURCE); 

可能有人請說明我有什麼錯?

事情是我的代碼是這一個,它工作正常。而且我沒有concatanate來源,它仍然工作正常。

print SOURCE "Ipadress #2\n\n"; 
foreach $k (sort keys %hash2){ 
    print SOURCE $k." = ".$hash2{$k}." paquet"; 
    if ($hash2{$k} >= 2) { print SOURCE "s";} 
    print SOURCE "\n"; 
} 

但我有很多代碼,做同樣的事情,所以我想創造一個功能,能夠減少線路的數量。

回答

3

你忘了一個逗號或串聯這裏:

print $value4 $k." = ".%{$value2{$k}}. $value3; 

的Perl認爲要使用$value4有一個文件句柄(符號),顯然$value4是不確定的。它之所以是不確定的,因爲你爲它分配$_[4]價值,但你可能想$_[3]

看起來你打算$value4是文件爲輸出(因爲數組零索引);如果是這樣的話,那麼實際上你需要打開該文件,以獲取文件句柄:

open my $fh, '>', $value4 or die "Could not open file $value4: $!"; 
... 
print { $fh } $k." = ".%{$value2{$k}}. $value3; 

所以,你有三件事情來解決:

  1. 弄清楚爲什麼$value4是不確定的,解決這個問題。 (當你發現自己追加數到標量的名字,那麼你可能仍要使用數組。你可以只@_直接使用或搶值成@args陣列,而不是一堆標量)。

  2. 找出你想如何格式化輸出字符串,並使用文件句柄,而不是文件名,爲print

  3. 找出你想如何序列化$value2{$k}引用的散列,因爲在標量上下文中打印散列幾乎肯定不是你想要做的。

(更新建議後,我意識到你缺乏一個文件句柄)