Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7929[/thread]

Variablen aus Subroutinen übernehmen



<< |< 1 2 >| >> 11 Einträge, 2 Seiten
shaihulud
 2006-04-27 19:50
#65370 #65370
User since
2006-04-12
76 Artikel
BenutzerIn
[default_avatar]
hab n prog das ne sub aus ner anderen datei aufruft.. ich hab 2 variablen im prog initialisiert und danach erst die sub aufgerufen, wieso sagt er wenn ichs ausführe dass die beiden variablen explicit packages brauchen? die sind doch schon ausserhalb der sub definiert. ich dachte du kannst nur nicht von aussen nach innen zugreifen, aber umgekehrt schon?!
n Freund von mir hat gemeint er hätte mal gesehn dass das bei Perl irgendwie anders gemacht werden muss damit die lebensdauer auch in der sub existiert.
weiss jemand wie?
betterworld
 2006-04-27 19:56
#65371 #65371
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Man kann in Perl (und in vielen anderen Sprachen) nur auf die Variablen zugreifen, die in der aktuellen Datei definiert sind, es sei denn, es handelt sich um globale Variablen. Globale Variablen sollte man aber nicht verwenden, weil das sehr unuebersichtlich ist. Kannst Du die Variablen (oder Referenzen darauf) nicht einfach als Parameter an deine Subroutine uebergeben?
Strat
 2006-04-27 20:19
#65372 #65372
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
brauchst n package var def mit use vars oder our und dann mit package vorn dran verwendn
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
shaihulud
 2006-04-27 20:24
#65373 #65373
User since
2006-04-12
76 Artikel
BenutzerIn
[default_avatar]
&hierarchie($name,@child,@parent);

die subroutine sieht so aus:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
sub hierarchie{

 use strict;
 use warnings;
 use File::Basename;

 my $suffix = '.a00';
 my @dateien = glob("*$suffix");
 my @ohneendung;
 my @namen;
 my $name = shift;
 my @n;
 my @child = shift;
 my @parent = shift;
 for my $datei (@dateien) {
   my $var = basename($datei,$suffix);
   #print "$name\n";
   push(@ohneendung,$var);
 }
 foreach my $ele (@ohneendung){
   #print "$ele\n";
   if($ele =~ /$name/){
     @n = split(/-/,$ele);
     if($name eq $n[0]){
     #print $name;
       push(@child,$n[1]);
     }else{
       push(@parent,$n[0]);
     }
   }
 }
}

so spuckt er nichts aus.. scheint also zu funzen. im moment kann ich das noch nicht nachvollziehn, aber denke das wars.
nur zum verständnis. ich muss in der subroutine aber nicht auch noch
return @parent,@child;
einfügen um diese im hauptprogramm weiter benutzen zu können?

was mich wundert ist dass ich die variablen in der subroutine nochmal definieren muss zb. my @parent = shift; obwohl ich sie im hauptprogramm am anfang doch schon defniert hatte?!
aber wenns so geht gehts eben so..\n\n

<!--EDIT|shaihulud|1146155153-->
shaihulud
 2006-04-27 20:34
#65374 #65374
User since
2006-04-12
76 Artikel
BenutzerIn
[default_avatar]
arg.. scheint doch nicht zu funzen. das gefüllte child arry kann ich in der sub ausgeben aber im hauptprogramm ist es wieder leer...

aber es funzt auch nicht wenn ich return @child,@parent; mach\n\n

<!--EDIT|shaihulud|1146156016-->
renee
 2006-04-28 10:15
#65375 #65375
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du musst mit Referenzen arbeiten. Du kannst nicht mehrere Arrays an Subroutinen übergeben (siehe perlsub). So wie Du es schreibst, ist Dein Array @parents nämlich leer.

Zeig mal etwas mehr vom Code. Du müsstest es ungefähr nach diesem Prinzip machen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
my @array_child = qw(1 2 3 4);
my @array_parent = qw(5 6 7 8);

my ($child_ref,$parent_ref) = methode(\@array_child,\@array_parent);

sub methode{
my ($ref_child,$ref_parent) = @_;
my @child = @$ref_child;
my @parent = @$parent;
# mach was
return \@child,\@parent;
}


Die ganzen use-Anweisungen machst Du am Besten ganz am Anfang vom Programm, damit es übersichtlicher bleibt.

Mehr zum Thema Referenzen findest Du auch unter perlreftut.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
shaihulud
 2006-04-28 11:52
#65376 #65376
User since
2006-04-12
76 Artikel
BenutzerIn
[default_avatar]
datei 1:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/usr/bin/perl

use lib qw(C:/Beispieldaten/);
use strict;
use document;
use material;

open(DATEI, "<P007201031.JPL") || die "Datei nicht gefunden";
my @Zeilen = <DATEI>;
close(DATEI);

my $Anzahlspalten = 0;
my $dokuart;
my %hash;
my @array;
my $ele;
my $test;
my $name;
my @child;
my @parent;

push(@child,5);

#Codezeugs das nichts mit child und parent zu tun hat

$test = document->new();
$test->spalteninfo(\@array);
$test->name(\$name);
&hierarchie(\@child,\@parent);
$test->child(\@child);
$test->parent(\@parent);
# foreach my $ele (@child){
# print "$ele\n";
# }


Datei 2:(sub)
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
sub hierarchie{

use strict;
use warnings;
use File::Basename;

my $suffix = '.a00';
my @dateien = glob("*$suffix");
my @ohneendung;
my @namen;
my $name = "P009401923";
my @n;
my @child = shift;
my @parent = shift;
push(@child,6);


for my $datei (@dateien) {
my $var = basename($datei,$suffix);
#print "$name\n";
push(@ohneendung,$var);
}
foreach my $ele (@ohneendung){
#print "$ele\n";
if($ele =~ /$name/){
@n = split(/-/,$ele);
if($name eq $n[0]){
#print $name;
push(@child,$n[1]);
}else{
push(@parent,$n[0]);
}
}
}
# foreach my $ele (@child){
# print "$ele\n";
# }

return \@child,\@parent;
}


also so wie ich es grad hab steht in child wenn ich ne ausgabe in datei 1 rein machen nur die 5 drinnen und wenn ich ne ausgabe in datei 2 mache steht die 5, die 6 und andere dinge drinnen... :-/
renee
 2006-04-28 12:16
#65377 #65377
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ja, die Variablen haben nichts mit einander zu tun. Nur weil sie durch Zufall den gleichen Namen haben, heißt das noch nicht, dass man da beliebig irgend wo draufzugreifen kann... Du müsstest in die Klasse "document" (Klassen schreibt man üblicherweise mit einem großen Initial also "Document") noch Methoden schreiben, die Dir die Arrays (bzw. Referenzen) zurückliefern, die Du dann auch im Hauptprogramm nutzen musst.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
shaihulud
 2006-04-28 13:46
#65378 #65378
User since
2006-04-12
76 Artikel
BenutzerIn
[default_avatar]
oki aber hat das nicht nur was mit der klasse zu tun? ich mein in erster linie ist mir die klasse ja wurst... ich will erstmal nur die arrays an ne sub übergeben und diese dann im hauptprog wieder auslesen. ich lese ja auch nicht die klasse mit meiner foreachschleife aus sondern nur die arrays als solches...
renee
 2006-04-28 14:10
#65379 #65379
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ja, kennst Du Dich etwas mit Objektorientierung aus? Das nennt man Kapselung. Du kannst in Deinem Hauptprogramm nicht die Variablen der Klasse auslesen. Stell Dir vor, Du stehst vor ner Wand, dort ist ein Schlitz drin, über den Du Zettel mit Zahlen in den Raum hinter der Wand schmeißt. Es sind keine Fenster und nichts in der Wand. Du weißt gar nicht was da hinter der Wand passiert. Du weißt nicht, ob da vielleicht einer im Raum sitzt und noch einen Zettel mit einer "6" drauf zu Deinen Zetteln dazu legt.

Du kannst auch mit den Zetteln nichts mehr anfangen. Die Wand ist massiv!

Du kannst erst mit dem Ergebnis von den Machenschaften im Raum anfangen, wenn noch eine andere Öffnung in der Wand ist, über die Du das Ergebnis ausgehändigt bekommst!
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2006-04-27 19:50.