Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

wie Arrays, die in einem Hash stecken an ein sub uebergeben?

29 views
Skip to first unread message

Astrid

unread,
Aug 9, 2017, 4:36:33 AM8/9/17
to
Hallo!

Habe ein sub, das 4 Arrays erwartet:

sub mysub {
my @x = @{$_[0]};
my @y= @{$_[1]};
my @mini= @{$_[2]};
my @maxi= @{$_[3]};
rest vom sub;
}

Urspruenglich hatte ich da auch 4 einzelne Arrays, die mit z.B.
my (@feld,@feld2,@feld3@feld4) definiert waren.

Inzwischen ist meine Datenstruktur leider kompilzierter geworden, sodass
einige arrays in einem hash stecken gefuellt mit
push @{$myhash1{'mykey'}}, @myarray;
dito myhash2, myhash3
und andere sogar noch komplexer in einem array, das hashes enthaelt, die
wiederrum arrays enthalten, gefuellt mit
%myhash4 = &dofn(0,5);
push @myhasharray, {%myhash4};
im dofn gefuellt in einer Schleife:
$myhash4{'var1'}[$i] = 4711 + $i;

Habe es probiert mit

$result = &mysub(\%{$myhash1{'mykey'}}, \@{$myhash4[4711]]->{'var1'}}, \%{$myhash2{'mykey'}}, \%{$myhash3{'mykey'}});

Aber es kommt
Global symbol "%myhash1" requires explicit package name
Global symbol "%myhash2" requires explicit package name
Global symbol "%myhash3" requires explicit package name

Wie kann ich diese Konstrukte an das sub uebergeben, so dass
sie im sub als array ankommen?

Gruss, Astrid


Christian Garbs

unread,
Aug 11, 2017, 5:06:24 PM8/11/17
to
Mahlzeit!

Astrid <astri...@gmail.com> wrote:

> Habe ein sub, das 4 Arrays erwartet:
>
> sub mysub {
> my @x = @{$_[0]};
> my @y= @{$_[1]};
> my @mini= @{$_[2]};
> my @maxi= @{$_[3]};
> rest vom sub;
> }

Einspruch: Das sub erwartet 4 Array-*Referenzen*, nicht 4 Arrays.
(4 Arrays gingen auch nicht, weil das zu einem Array zusammengematscht
würde.)

> Urspruenglich hatte ich da auch 4 einzelne Arrays, die mit z.B.
> my (@feld,@feld2,@feld3@feld4) definiert waren.

> Inzwischen ist meine Datenstruktur leider kompilzierter geworden, sodass
> einige arrays in einem hash stecken gefuellt mit

[...]

> und andere sogar noch komplexer in einem array, das hashes enthaelt, die
> wiederrum arrays enthalten, gefuellt mit

[...]

> Wie kann ich diese Konstrukte an das sub uebergeben, so dass
> sie im sub als array ankommen?

Wie gesagt, willst Du eigentlich Array-*Referenzen* übergeben.

Da in Deinem Hash bzw. Array bereits Referenzen stecken, brauchst Du
nichts weiter zu tun, als die direkt zu übergeben, z.B. so:

$result = &mysub( $myhash1{mykey}, $myhash4[4722]->{var1},
$myhash2{mykey}, $myhash3{mykey} );

Gruß
Christian

PS: Wenn $myhash4 jetzt keine HashRef mehr ist, sondern eine ArrayRef,
sollte die Variable umbenannt werden, das ist sonst fies ;-)

--
sub _{print"\n"}_;for(;$s<9;++$s){$_='1E2018201E00001E2018201E00001E2018201'
.'E002020001C2222221400005CA2A2A27C02001C2222221C20003E040202201F2422221C00'
.'242A2A2A12002020001C2222221F20001C2A2A2A0C';while(s;(..);;){printf'%c',hex
$1&1<<$s?40:32}_}$_=':::Christian Garbs:<mi...@cgarbs.de>',y;:;\t;;print;_;_
0 new messages