2013-05-06 11 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); 

誰かが間違っているものを私に示していただけますか?

これは私のコードですが、うまくいきます。私は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"; 
} 

が、私は同じことを私はライン数を減らすことができるように機能を作りたかったんコードの多くを抱えています。

答えて

3

あなたはここにコンマまたは連結を忘れてしまった:

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

Perlはファイルハンドル(記号)を持っている、と明らかに$value4が未定義であるあなたが$value4を使用したいと考えています。それが定義されていない理由は、あなたはそれを$_[4]の値を割り当てていますが、おそらく$_[3]をしたいので、あなたの出力のためのファイル名前する$value4をつもりのように見えます

(配列はゼロインデックス化されているため。);それはその後、ケースの場合は、実際にファイルハンドルを取得するために、そのファイルを開く必要があります。$value4は未定義で、これを修正する理由

  1. 図アウト:

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

    だからあなたが修正するための3つのことを持っています。 (スカラーの名前に数字を追加すると、おそらく配列を使用する可能性があります。ちょうど@_を使用するか、スカラーの束ではなく@args配列に値を入れてください)

  2. printの場合、出力文字列をどのようにフォーマットし、ファイルハンドルではなくファイルハンドルを使用するかを解説します。

  3. $value2{$k}で参照されるハッシュをシリアル化する方法を解説します。スカラーコンテキストでハッシュを印刷することは、あなたがやりたいことではないからです。

(更新の提案私はあなたがファイルハンドルを欠いているが実現した後)
関連する問題