[Dresden-pm] Hash slice (war Re: Problem mit Moduleinbindung)

Steffen Schwigon schwigon at webit.de
Mi Aug 15 01:45:31 PDT 2007


Hi!

Was wir bei der Gelegenheit noch ästhetischer machen können, ist der
Ergebnis-Hash, dann wird die Zeile auch nicht zu lang:

"Thomas Rittsche" <thomas.rittsche at gmail.com> writes:
>  ($value{'a'}, $value{'b'}, $value{'c'}) = eval"$myModul::calculate(\%val)";

Vorab: bei Hashkeys kannst und solltest Du grundsätzlich die
Hochkommas weglassen, wenn es eindeutig Strings sind:

  ($value{a}, $value{b}, $value{c}) = eval "$myModul::calculate".'(\%val)';

Jetzt zum eigentlichen: es gibt's eine Syntax, um mehrere Hash-Entries
am Stück anzugeben, ein sogenannter Hash-Slice:

  @value{qw(a b c)} = eval "$myModul::calculate".'(\%val)';

Beachte die Kombination aus Sigil @ (obwohl es Hash ist) und
geschweiften Klammern. Aus den geschweiften Klammern geht hervor, dass
es ein Hashzugriff ist und das @ steht da, weil das Ergebis ein Array
ist, nämlich alle Hashelemente, deren Keys in der geschweiften Klammer
stehen.

Das qw() verwende ich, um kein Komma/Hochkomma-Plaque zu bekommen,
sonst stünde da:

  @value{'a', 'b', 'c'} = eval "$myModul::calculate".'(\%val)';

Das nur zur Erläuterung.


Du kannst Dir mit Hashslices Deine Keys auch noch dynamisch
zusammensetzen und dann das Array der Keys verwenden, logisch:

  my @keys = qw(a b c);
  @value{@keys} = eval "$myModul::calculate".'(\%val)';


Steffen
-- 
Steffen Schwigon <schwigon at webit.de>
Dresden Perl Mongers <http://dresden-pm.org/>
Deutscher Perl-Workshop <http://www.perl-workshop.de/>