Hash an Unterfunktion
hotti
- perl
hi,
malne Nachfrage, weil ich lang nichts in Perl gemacht habe, ich will sowas:
test(a => 25, b => 33);
und habe in der sub:
sub test{
my %p = map{$_}@_;
# Vorbelegen
$p{a} ||= 'default';
print "$p{a}\n";
}
die sub gibt "25" aus, weil der key "a" mit einem Wert belegt ist. Ist er das nicht, wird "default" ausgegeben. Soweit sogut, -w meckert nicht, aber:
Ist das so ok vom Style her? Gibts da noch eine andere, evnt. elegantere Lösung?
Hotte
Tach auch.
[...]
Ist das so ok vom Style her? Gibts da noch eine andere, evnt. elegantere Lösung?
Wie wäre es, wenn du eine Referenz auf den Hash übergibst?
Bis die Tage,
Matti
hi,
malne Nachfrage, weil ich lang nichts in Perl gemacht habe, ich will sowas:
test(a => 25, b => 33);
Warum nicht
test( { a => 25, b => 33 } );
sub test{
my $hasrref=shift;
...
}
sub test{
my %p = map{$}@;Vorbelegen
$p{a} ||= 'default';
print "$p{a}\n";
}
> ...
> Ist das so ok vom Style her? Gibts da noch eine andere, evnt. elegantere Lösung?
Ja mit einer Hashreferenz.
Du hast dann immer noch die Freiheit, ob du auf originalen Daten oder auf einer Kopie arbeiten willst.
mfg Beat
--
><o(((°> ><o(((°>
<°)))o>< ><o(((°>o
hi,
also hashref... ok,
dankende Grüße,
Hotte
Moin Moin!
test(a => 25, b => 33);
sub test{
my %p = map{$_}@_;
Das map ist über.
(my %p)=@_;
[/perl]
> # Vorbelegen
> $p{a} ||= 'default';
Schade, dass Perl Deine Kommentare nicht versteht.
Wenn Du Die Funktion mit a=>0 oder a=>'' aufrufst, wird $p{'a'} auf 'default' gesetzt. Das ist nicht immer das, was Du willst.
[code lang=perl]
$p{'a'}//='default'; # perl >= 5.10
$p{'a'}='default' unless defined $p{'a'}; # perl < 5.10
Und wenn auch undef erlaubt sein soll:
$p{'a'}='default' unless exists $p{'a'}; # alle Versionen
Wenn Du wirklich eine Vorbelegung haben willst, weise die Default-Werte vor @_ zu und überschreibe dann mit @_:
my %p=( a => 'default', @_); # Perl garantiert, dass der LETZTE Key gewinnt
Etwas Paranoia hinsichtlich der Anzahl der Elemente in @_ wäre auch nicht schlecht:
@_%2 && die "Expected a hash"; # sonst gibt es 'Odd number of elements in hash assignment'
Der Weg über eine Hash-Referenz bietet sich in vielen Situationen ebenfalls an, die Variante oben nutze ich eigentlich nur für benannte Parameter.
Alexander
moin,
Vorbelegen
$p{a} ||= 'default';
Schade, dass Perl Deine Kommentare nicht versteht.Wenn Du Die Funktion mit a=>0 oder a=>'' aufrufst, wird $p{'a'} auf 'default' gesetzt. Das ist nicht immer das, was Du willst.
Jes, bin selbst dahintergekommen am Rest des Abends ;-)
defined und exists sind wieder meine Freunde geworden, ich hab nun alle Fälle damit abgedeckt. Btw., es werden in meinem Fall nicht nur scalare Übergeben, sondern auch weitere hash-Referenzen auf Veranstaltungen, Feiertage usw. (wenns fertig ist, wird das eine Terminverwaltung fürn Verein).
Danke Dir für alle Hinweise, Alexander,
Hotte
Hi,
weil Ihr mir hier so nett geholfen habt, dürft Ihr Euch die erste Anwendung meiner neuen Funktion hier mal angucken.
Viel Spaß damit,
Hotte