Hash übergeben; for %hash
Stella
- perl
Hi selfer!
ich möchte ein Hash an eine Methode übergeben und diesen Hash dann durchlaufen ($key, $value).
my %hash = {a => 'foo', b => 'bar'};
test1(%hash);
sub test {
my $self = shift;
my %hash = shift;
while ( my ($key, $value) = each(%hash) ) {
print "$key => $value\n";
}
# oder
for my $key ( keys %hash ) {
my $value = $hash{$key};
print "$key => $value\n";
}
}
bei beiden Schleifen erhalte ich nur "HASH(0x84189c4) => " als Ausgabe.
Warum wird 1. die Schleife nur einmal durchlaufen und 2. warum erhalte ich nicht den Schlüssel und den Wert?
3. Wie kann ich überprüfen, ob 1 Parameter übergeben wurden?
@_ == 2 || die 'xyz';
schlägt immer fehl, da @_ 3 (warum 3?) ist.
Danke und eine friedliche Nacht :-)
Stella
Hallo,
ich möchte ein Hash an eine Methode übergeben und diesen Hash dann durchlaufen ($key, $value).
my %hash = {a => 'foo', b => 'bar'};
Dein hash ist nicht richtig deklariert, benutze einfache Klammern.
Am besten eine Referenz in die Subfunktion übergeben, like this:
[code lang=perl]
my %hash = ('a' => 'foo', b => 'bar');
test(%hash);
sub test {
my $ref = shift;
while ( my ($key, $value) = each %{$ref} ) {
print "$key => $value\n";
}
}
Hotte
Hi
my %hash = {a => 'foo', b => 'bar'};
Dein hash ist nicht richtig deklariert, benutze einfache Klammern.
Am besten eine Referenz in die Subfunktion übergeben, like this:[code lang=perl]
my %hash = ('a' => 'foo', b => 'bar');
test(%hash);sub test {
my $ref = shift;
while ( my ($key, $value) = each %{$ref} ) {
print "$key => $value\n";
}
}
ok, das kommt von Copy und Paste :-(
eine Frage hätte ich noch
ich möchte nach der Schleife überprüfen ob es ein bestimmtes Element im hash gibt und ob er nicht leer ist
~~~perl
if(%{$ref{elementname}}){
...
}
-> Global symbol "%ref" requires explicit package name at /opt/x/y/z/test.pm line 35.
Stella
ich möchte nach der Schleife überprüfen ob es ein bestimmtes Element im hash gibt und ob er nicht leer ist
Dein Hash ist eine Referenz auf ein Hash und muss entsprechend dereferenziert werden.
Du solltest dir mal die Doku anschauen:
http://perldoc.perl.org/perlref.html
(die auch auf deiner Festplatte ist, wenn du Perl installiert hast)
Struppi.
Hi
eine Frage hätte ich noch
ich möchte nach der Schleife überprüfen ob es ein bestimmtes Element im hash gibt und ob er nicht leer ist
exists EXPR
Given an expression that specifies a hash element or array
element, returns true if the specified element in the hash or
array has ever been initialized, even if the corresponding value
is undefined. The element is not autovivified if it doesn't
exist.
print "Exists\n" if exists $hash{$key};
print "Defined\n" if defined $hash{$key};
print "True\n" if $hash{$key};
print "Exists\n" if exists $array[$index];
print "Defined\n" if defined $array[$index];
print "True\n" if $array[$index];
usw. Siehe perldoc -f exists und auch Struppies Antwort.
Viel Spass noch,
Hotte
Hi
eine Frage hätte ich noch
ich möchte nach der Schleife überprüfen ob es ein bestimmtes Element im hash gibt und ob er nicht leer ist
if(%{$ref{elementname}}){
...
}
~~~perl
if(!${$ref}{'elementname'}){
...
}
funktioniert :-)
Stella
if(%{$ref{elementname}}){
...
}
>
> ~~~perl
if(!${$ref}{'elementname'}){
> ...
> }
funktioniert :-)
Kann man machen, ich finde es aber so schöner
if(!$ref->{elementname}){...
So dürfte es auch auf der Perldoc seite die ich dir gezeigt habe stehen.
Struppi.