Schrift
[thread]8655[/thread]

Referenz von Array an Subroutine

Leser: 1


<< >> 7 Einträge, 1 Seite
Gast Gast
 2007-01-19 13:24
#73308 #73308
Hi,

ich suche mir momentan einen Wolf! :(

Ich möchte von einer Perl-Datei (Hauptprogramm/Hauptmodul) auf die Subroutine in einer anderen Perl-Datei (Funktionsscript/Nebenmodul) zugreifen und dabei ein Array übergeben, welches in meiner Subroutine im anderen Modul mit Werten gefüllt wird. Anschließend möchte ich im aufrufenden Modul auf die Werte im array zugreifen. Ich möchte allerdings das Array nicht mit Hilfe von return zurückgeben, da ich mit return bereits etwas anderes zurückegebe!

Kann mir jemand von euch sagen, wie die Aufrufe mit ggf. Referenzen (Adressen) etc. auszusehen haben, damit ich nach dem Aufruf der Subroutine im Hauptprogramm wieder draufzugreifen kann?

Danke im voraus!
Muecke
betterworld
 2007-01-19 13:30
#73309 #73309
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Das koennte ungefaehr so gehen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
use strict;
use warnings;

sub blah {
my ($arrayref) = @_;
push @$arrayref, 42;
}

blah(\my @array);
print "darin ist @array\n";

Mit dem Backslash machst Du eine Referenz auf das Array. Die andere Subroutine hat die Referenz dann in dem Skalar $arrayref stehen und kommt ueber @$arrayref oder auch @{$arrayref} an das Array selbst ran.

Lies auch mal perldoc perlreftut.\n\n

<!--EDIT|betterworld|1169206512-->
pq
 2007-01-19 13:58
#73310 #73310
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
bzw. perlreftut (sogar auf deutsch)
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Kalmuecke
 2007-01-19 14:25
#73311 #73311
User since
2006-10-14
68 Artikel
BenutzerIn
[default_avatar]
danke euch!

dann habe ich es richtig gemacht nur mein Inhalt vom Array wird nicht angezeigt!
In der subroutine wird der Inhalt allerdings angezeigt! :(
topeg
 2007-01-19 15:00
#73312 #73312
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Dann hast du irgendwo die Referenz aufgelöst.

Ein Beispiel wann das passiert:
Code: (dl )
1
2
3
4
my @array1=(1,2,3);
my $array_ref=\@array1;
my @array2=@$array_ref;
push(@array2,4);

In "@array1" steht (1,2,3)
In "@array2" steht (1,2,3,4)
Mit dem "@array2=@$array_ref" wurde die Referenz gelöst und alles was du mit "@array2" machst hat keine Auswirkung auf das "@array1".
Kalmuecke
 2007-01-19 16:43
#73313 #73313
User since
2006-10-14
68 Artikel
BenutzerIn
[default_avatar]
Habe das Problem lösen können!

Aber wie mache ich das denn mit Referenzen, wenn ich an eine Subroutine ein 2-dim Array übergeben will???

Bsp.:

Mein Array sieht so aus:

Code: (dl )
1
2
3
4
5
my @configArray       = (); 
my @configKeyArray    = ();
my $refConfigArray    = \@configArray;
my $refConfigKeyArray = \@configKeyArray;  
my @confCodesArray    = ([$refConfigArray], [$refConfigKeyArray]);


jetzt möchte ich im Hauptprgramm meine funktion aufrufen, die
sich in einer anderen Datei befindet:
Quote
meineSubroutine(\@confCodesArray);


innerhalb der subroutine:

Quote
meineSubroutine
{
my $confCodesArrayRef = @_;
my @confCodesArray = @$confCodesArrayRef;
}


Das letzte funktioniert allerdings nicht!
Kann mir da jemand helfen?\n\n

<!--EDIT|Kalmuecke|1169217905-->
topeg
 2007-01-19 17:56
#73314 #73314
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Da habe ich noch ein paar Fragen:

warum packst du die referenzen jeweils ein anonymes Array?:
Code: (dl )
my @confCodesArray    = ([$refConfigArray], [$refConfigKeyArray]);

der Aufruf wäre dabei:
Code: (dl )
1
2
3
$refConfigArray=$confCodesArray[0][0];
#und
$refConfigKeyArray=$confCodesArray[1][0];


Warum glaubst du, daß die Referenz hier:
Code: (dl )
my @confCodesArray = @$confCodesArrayRef;

nicht aufgelöst (ich sollte wohl besser sagen: zerstört) wird?
Woltest du an der Stelle "$refConfigArray" und "$refConfigKeyArray" so kämst du so daran:
Code: (dl )
1
2
3
$refConfigArray=$$confCodesArrayRef[0][0];
#und
$refConfigKeyArray=$$confCodesArrayRef[1][0];


Dann Frage ich mich watum du das ganze nicht als mit einem Hash gemacht hast, wenn du schon einen Schlüssel mit zugehörigem Wert hast.
<< >> 7 Einträge, 1 Seite



View all threads created 2007-01-19 13:24.