不能使用未定义的值作为符号perl

use*_*456 5 parameters perl hash file-io function

我正在尝试在文件中写入从数组中获取的一些值.但我有一些错误''不能使用未定义的变量作为...第81行的符号引用:

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 );
Run Code Online (Sandbox Code Playgroud)

有人可以指出我有什么问题吗?

事情是我的代码是这一个,它工作正常.而且我没有连同SOURCE并且它仍然正常工作.

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";
}
Run Code Online (Sandbox Code Playgroud)

但我有很多代码可以做同样的事情所以我想创建一个能够减少行数的函数.

fri*_*edo 3

您在这里忘记了逗号或连接:

print $value4 $k." = ".%{$value2{$k}}. $value3;
Run Code Online (Sandbox Code Playgroud)

Perl 认为您要使用$value4有一个文件句柄(符号),并且显然$value4是未定义的。它未定义的原因是因为您为其分配了$_[4]您可能想要的值$_[3](因为数组是零索引的。)

看起来您打算$value4成为输出的文件名;如果是这种情况,那么您需要实际打开该文件才能获取文件句柄:

open my $fh, '>', $value4 or die "Could not open file $value4: $!";
...
print { $fh } $k." = ".%{$value2{$k}}. $value3;
Run Code Online (Sandbox Code Playgroud)

所以你需要解决三件事:

  1. 找出$value4未定义的原因并修复它。(当您发现自己将数字附加到标量的名称上时,您可能无论如何都想使用数组。您可以直接使用@_或将值抓取到@args数组中,而不是一堆标量中。)

  2. 弄清楚您想要如何格式化输出字符串并使用文件句柄,而不是文件名print

  3. 弄清楚您想要如何序列化 引用的哈希$value2{$k},因为在标量上下文中打印哈希几乎肯定不是您想要做的。

(在我意识到你缺少文件句柄后更新了建议)