Stella: Hash übergeben; for %hash

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

  1. 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
    
    1. 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

      1. 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.

      2. 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

      3. 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

        1. 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.