Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]9175[/thread]

Use of uninitialized value ...: Hash mit Array als value (undef)

Leser: 2


<< |< 1 2 >| >> 15 Einträge, 2 Seiten
Duff
 2007-07-10 16:56
#78342 #78342
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Hallo,

ich habe mal wieder Probleme mit der Ausgabe bzw. der folgenden Fehlermeldung, die bei der Ausgabe kommt:
Code: (dl )
Use of uninitialized value in printf ...


Meine Ausgabe sieht so aus:
Code: (dl )
1
2
3
foreach my $key (sort keys %hash) {
printf ("%-35s : %-80s\n", $key, @{$hash{$key}});
}


Das Problem ist wohl, dass in einem Array-value des hashes der Wert undef steht.

Wie bekomme ich nun nochmal eine Ausgabe hin, die mir keine Key ausgibt, bei dem der Value auf undef steht?
D'OH
Daniel
Linuxer
 2007-07-10 17:05
#78343 #78343
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Du kannst kontrollieren, ob der Array Elemente enthält; wenn ja, dann gibst Du was aus.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
for my $k ( sort keys %hash ) {
  my @arr = @{ $hash{$k} };

  if ( $#arr >= 0 ) {
    # array im string interpolieren lassen, sonst kommt nur das erste Element zur Anzeige...
    printf ( "%-35s : %-80s\n", $k, "@arr" );
    # oder verwende join()
  }
}


Code ungetestet.
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
renee
 2007-07-10 17:12
#78344 #78344
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du kannst das auch gleich mit

Code (perl): (dl )
1
2
3
if( @arr ){ 
    #... 
}


bzw. mit
Code (perl): (dl )
1
2
3
if( @{ $hash{$k} } ){
    # ...
}
machen...

TIMTOWTDI ;)\n\n

<!--EDIT|renee|1184073210-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Duff
 2007-07-10 17:30
#78345 #78345
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Danke für die Antworten, aber es kommt noch immer die Fehlermeldung und zwar mit Zeilenangabe, dass es in der if-Zeile ist:

Code: (dl )
1
2
3
if( @{ $hash{$k} } ){
....
}


Ein print Dumper(%hash) zeigt, dass ein Wert in dem ganzen so aussieht:
Code: (dl )
1
2
3
4
5
6
7
8
$VAR175 = '[key]';
$VAR176 = [
undef
];
$VAR177 = '[key]';
$VAR178 = [
'value'
];
D'OH
Daniel
Linuxer
 2007-07-10 17:39
#78346 #78346
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Hm, OK.

Da wird ein Element eines Array angemeckert, das 'undef' ist;

Eine Art, das zu lösen, wäre:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
for my $k ( sort keys %hash ) {

    # Elemente, die 'undef' sind, auf '' setzen
    #my @arr = map{ defined $_ ? $_ : '' } @{ $hash{$k} };
    # oder mittels grep nur die "defined" Elemente nehmen
    my @arr = grep { defined $_ } @{ $hash{$k} };

    if ( @arr ) {
        printf "%s %s\n", $k, "@arr";
    }
}


Die beiden Varianten habe unterschiedliche Resultate!
Was Du haben willst, musst Du entscheiden.

edit: Grammatik korrigiert.\n\n

<!--EDIT|Linuxer|1184074812-->
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
Duff
 2007-07-10 18:03
#78347 #78347
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Ja genau, so funktioniert es.
Habe mich für die Variante mit grep entschieden, da dann nur Werte angezeigt werden, die kein undef enthalten (so wird auch kein '' angezeigt).

Kann ich auf einfache Art und Weise nun auch noch den Hash auf die values sortieren lassen und nicht auf die keys bzw. erst nach value und dann nach keys?
D'OH
Daniel
renee
 2007-07-10 19:47
#78348 #78348
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
(ungetestet)
Code (perl): (dl )
sort{ $hash{$a} cmp $hash{$b} or $a cmp $b }keys %hash
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Duff
 2007-07-11 10:23
#78349 #78349
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Leider funktioniert das Ganze in der for-Schleife so nicht.

Dann werde ich wohl noch was rumprobieren müssen...
D'OH
Daniel
renee
 2007-07-11 11:04
#78350 #78350
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=Duff,11.07.2007, 08:23]Leider funktioniert das Ganze in der for-Schleife so nicht.[/quote]
Das ist leider nicht aussagekräftig. *Was* funktioniert nicht? Bekommst Du eine Fehlermeldung?
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Linuxer
 2007-07-11 11:14
#78351 #78351
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
[quote=Duff,10.07.2007, 16:03]Kann ich auf einfache Art und Weise nun auch noch den Hash auf die values sortieren lassen und nicht auf die keys bzw. erst nach value und dann nach keys?[/quote]
Was willst Du denn konkret sortiert haben?

"Values" sind bei Dir ja Array-Referenzen. Willst Du nun eine Sortierung nach diesen Referenzen ( ARRAY(0x4711) cmp ARRAY(0x0815) )?
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
<< |< 1 2 >| >> 15 Einträge, 2 Seiten



View all threads created 2007-07-10 16:56.