expertenaustausch > comp.lang.* > comp.lang.perl.misc

Astrid (09.08.2017, 10:36)
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 (11.08.2017, 23:06)
Mahlzeit!

Astrid <astrid.kuhr> 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 ;-)
Ähnliche Themen