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

Hashreferenz auf Gültigkeit prüfen

Leser: 2


<< >> 10 Einträge, 1 Seite
Duff
 2008-08-01 13:58
#112975 #112975
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Hallo,

ich habe mal wieder eine Frage.

Und zwar übergebe ich aus einer Funktion heraus eine Hashreferenz.

Nun möchte ich anschließend überprüfen, ob überhaupt Werte in der Hashreferenz vorhanden sind.

Wie muss ich vorgehen???

Beispiel:
Code: (dl )
my $hash_ref=function( $param );
D'OH
Daniel
renee
 2008-08-01 14:04
#112977 #112977
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Kommt darauf an, wie genau Du das prüfen willst...

Code (perl): (dl )
1
2
3
if( $hash_ref and ref( $hash_ref ) and ref( $hash_ref ) eq 'HASH' and keys %$hash_ref ){
    #...
}
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
 2008-08-01 14:04
#112978 #112978
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Habe es nun so gelöst:

Code (perl): (dl )
1
2
3
4
5
my $quota_res=check_quota( parse_passwd($file) );

my @keys_quota_res=keys %$quota_res;
my $length=$#keys_quota_res+1-$[;
print "$length\n";


Wobei ich danach noch über if($length ne "0") überprüfen muss, ob auch Werte (Schlüssel aus dem Hash) vorhanden sind.

Gibt es elegantere Lösungen???
D'OH
Daniel
renee
 2008-08-01 14:06
#112979 #112979
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code (perl): (dl )
1
2
3
 if( @keys_quota_res ){
    # keys vorhanden
}
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/
nepos
 2008-08-01 14:07
#112980 #112980
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Das hängt davon ab.
Wenn deine Sub undef liefert, prüft du mit defined($hash_ref).
Wenn der Hash wirklich leer ist, also die Sub quasi return {} macht, dann kannst du einfach so testen: if ( $hash_ref) ...
Das wird nur TRUE, wenn der Hash auch Daten enthält.
Du kannst das auch kombinieren:
Code (perl): (dl )
1
2
my $hash_ref = function($param);
if ( defined $hash_ref and %$hash_ref) { ... }
Duff
 2008-08-01 14:15
#112981 #112981
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Ok, danke euch beiden.

Werde wohl den Vorschlag von nepos verwenden, da ich diesen verstehe.

@renee: Kannst du mir diese Zeile von dir if( $hash_ref and ref( $hash_ref ) and ref( $hash_ref ) eq 'HASH' and keys %$hash_ref ){
vielleicht mal etwas näher erklären (insbesondere das ref())?
Danke.

PS: Ich bekomme übrigens keine Mail-Notification mehr, wenn jemand was zu diesem Post geschrieben hat.
D'OH
Daniel
pq
 2008-08-01 14:19
#112982 #112982
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
renee+2008-08-01 12:04:45--
Kommt darauf an, wie genau Du das prüfen willst...

Code (perl): (dl )
1
2
3
if( $hash_ref and ref( $hash_ref ) and ref( $hash_ref ) eq 'HASH' and keys %$hash_ref ){
    #...
}

da ist ein grosser teil unnötig.
Code (perl): (dl )
if (ref $hash eq 'HASH' and keys %$hash) {

ref() liefert nämlich bei undef oder keiner ref einfach den leeren string.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
renee
 2008-08-01 14:24
#112984 #112984
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
ref( $hash_ref ) liefert Dir den Namen des Referenztyps (bei Objekten, den Klassennamen zu dem das Objekt gehört).

Code (perl): (dl )
1
2
3
4
5
6
7
print ref( \$scalar ); # SCALAR
print ref( {} ); # HASH
print ref( [] ); # ARRAY

print ref( \&subroutine ); # CODE

print ref( CGI->new ); # CGI


Ich überprüfe erst, ob $hash_ref einen "wahren" Wert zurückliefert. Danach, ob überhaupt ein "ref"-Ergebnis zurückkommt. Wenn Du einen String oder eine Zahl zurückliefern würdest, würde ref einen leeren String zurückliefern (print ref "test"; # nix). Wenn ref einen String liefert liefert, teste ich, ob es ein Hash ist (siehe Beispiele oben) und wenn es eine Hashreferenz ist, überprüfe ich noch, ob Schlüssel in dem Hash existieren.

So eine Überprüfung ist vor allem dann notwendig, wenn Du auf die Subroutine, die $hash_ref liefert keinen Einfluss hast (z.B. externe Module).
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
 2008-08-01 14:27
#112985 #112985
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Danke für die ausführliche Erklärung.

Nun habe ich es auch verstanden.
D'OH
Daniel
renee
 2008-08-01 14:28
#112986 #112986
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
pq+2008-08-01 12:19:14--
da ist ein grosser teil unnötig.
Code (perl): (dl )
if (ref $hash eq 'HASH' and keys %$hash) {

ref() liefert nämlich bei undef oder keiner ref einfach den leeren string.


Stimmt, ich vergess meistens, dass es ein leerer String ist, der dann zurückgegeben wird...
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/
<< >> 10 Einträge, 1 Seite



View all threads created 2008-08-01 13:58.