6

配列から取得した値をファイルに書き込もうとしています。しかし、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 );

誰かが私に何が悪いのか教えてもらえますか?

私のコードはこれであり、正常に動作します。そして、私は 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";
}

しかし、同じことを行うコードがたくさんあるので、行数を減らすことができる関数を作成したかったのです。

4

1 に答える 1

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;

したがって、修正する必要があるのは次の 3 つです。

  1. が定義されていない理由$value4を突き止め、修正します。(スカラーの名前に数値を追加していることに気付いた場合、とにかく配列を使用したい可能性があります。スカラーの束ではなく@_、直接使用するか、配列に値を取り込むことができます。)@args

  2. 出力文字列をどのようにフォーマットし、ファイル名ではなくファイルハンドルを使用するかを考えてくださいprint

  3. によって参照されるハッシュをどのようにシリアル化する$value2{$k}かを考えてください。スカラー コンテキストでハッシュを出力することは、ほとんどの場合、やりたいことではないからです。

(ファイルハンドルが不足していることに気付いた後、提案を更新しました)

于 2013-05-06T02:03:55.360 に答える