Schrift
[thread]8887[/thread]

Teil eines Hashes an Subroutine übergeben



<< >> 5 Einträge, 1 Seite
RalphFFM
 2007-03-29 12:05
#75502 #75502
User since
2006-11-16
258 Artikel
BenutzerIn
[Homepage] [default_avatar]
Gegeben sei ein stinknormaler Hash of Hashes.
Elemente sind beispielsweise:
$hash{"eins"}{"subeins"}
$hash{"eins"}{"subzwei"}
$hash{"zwei"}{"subeins"}
$hash{"zwei"}{"subzwei"}

Nun möchte ich am liebsten $myhash{"zwei"} an eine Subroutine schubsen, also bildhaft gesprochen den "Teilzweig" übergeben.
Egal ob per Call by Value oder by Reference.
Eine Referenz auf ein _ganzes_ Hash könnte ich mit \%hash übergeben, aber ich hätte gerne nur den Teil den o.g. Teil des Hashes übergeben (bzw. eine Referenz darauf).
Ein \%hash{"zwei"} oder \$hash{"zwei"} zu übergeben akzeptiert Perl aber nicht!

Wie schaffe ich das?
Taulmarill
 2007-03-29 12:09
#75503 #75503
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
$myhash{zwei} ist bereits eine Referenz. Das kannst du einfach direkt übergeben und dann in der sub wie eine Referenz benutzen.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
RalphFFM
 2007-03-29 12:28
#75504 #75504
User since
2006-11-16
258 Artikel
BenutzerIn
[Homepage] [default_avatar]
Wie greife ich dann in der Sub darauf zu? Mir ist noch nicht klar wie Du "in der Sub wie eine Referenz benutzen" meinst.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/perl
use warnings; use strict;
my %hash;
$hash{"eins"}{"subeins"} = "hallo 1";
$hash{"eins"}{"subzwei"} = "welt 1";
$hash{"zwei"}{"subeins"} = "hallo 2";
$hash{"zwei"}{"subzwei"} = "welt 2";
&probiere($hash{"zwei"});
exit;
sub probiere {
my $myhashref = shift;
print %{$myhashref}{"subeins"}; # klappt nicht
}
Taulmarill
 2007-03-29 12:36
#75505 #75505
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
Es gibt zwei Möglichkeiten. Entweder als Referenz, wobei du dabei im Hinterkopf behalten musst, dass Änderungen dann auch in der ursprünglichen Variable zum tragen kommen.
Code: (dl )
1
2
3
4
sub probiere {
my $myhashref = shift;
print $myhashref->{subeins};
}

Oder du Kopierst den Hash. Das braucht allerdings mehr Speicher und CPU.
Code: (dl )
1
2
3
4
sub probiere {
my %newhash = %{ shift() };
print $newhash{subeins};
}


Zum weiterlesen: perlreftut, perldsc, perllol\n\n

<!--EDIT|Taulmarill|1175157507-->
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
RalphFFM
 2007-03-29 12:48
#75506 #75506
User since
2006-11-16
258 Artikel
BenutzerIn
[Homepage] [default_avatar]
Wunderbar, ja so klappt es.
Vielen Dank für die Quellen zum Weiterlesen, werde ich tun.
<< >> 5 Einträge, 1 Seite



View all threads created 2007-03-29 12:05.