2013-05-06 74 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}引用的散列,因为在标量上下文中打印散列几乎肯定不是你想要做的。

(更新建议后,我意识到你缺乏一个文件句柄)