2013-05-06 14 views
5

Próbuję zapisać w pliku pewną wartość wziętą z tablicy. Ale mam jakiś błąd „” nie można używać niezdefiniowanych zmiennych jako punkt odniesienia symbolu na linii ... 81:nie można użyć niezdefiniowanej wartości jako symbolu 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); 

Może ktoś proszę wskazać mi, co się stało?

rzeczy jest mój kod jest ten i działa dobrze. I nie połączyłem SOURCE i nadal działa dobrze.

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"; 
} 

ale mam wiele kodów, które robi to samo, więc chciałem stworzyć funkcję, aby móc zmniejszyć liczbę linii.

Odpowiedz

3

Twój zapomniał przecinka lub konkatenacji tutaj:

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

Perl myśli chcesz użyć $value4 ma uchwytu pliku (symbol) i najwyraźniej $value4 jest niezdefiniowany. Powodem jest to nieokreślone dlatego ją przypisać wartość $_[4] ale prawdopodobnie chcesz $_[3]

Wygląda zamierzają $value4 być plik nazwa do wyjścia (ponieważ tablice są indeksowane od zera.); jeśli o to chodzi, to musisz faktycznie otworzyć ten plik, aby uzyskać uchwytu pliku:

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

Więc masz trzy rzeczy Fix:

  1. dowiedzieć się, dlaczego $value4 jest niezdefiniowany i naprawić. (Gdy do liczby skalarów są dołączane numery, prawdopodobnie będziesz chciał użyć tablicy, możesz użyć tylko @_ bezpośrednio lub pobrać wartości do tablicy @args, a nie kilka skalarów.)

  2. Dowiedz się, jak chcesz sformatować ciąg wyjściowy i użyć uchwytu pliku, a nie nazwy pliku, dla print.

  3. Dowiedz się, jak chcesz przekształcić hash, do którego odwołuje się $value2{$k}, ponieważ drukowanie skrótu w kontekście skalarnym prawie na pewno nie jest tym, co chcesz zrobić.

(aktualizacja sugestii po zdałem sobie sprawę, że brakuje Ci filehandle)