Schrift
[thread]11089[/thread]

Zugriff auf sub-Funktionen



<< >> 10 Einträge, 1 Seite
Alvin
 2008-01-02 16:04
#104340 #104340
User since
2007-12-28
9 Artikel
BenutzerIn
[default_avatar]
Hi,

hab mal wieder ne Anfängerfrage.

Ich habe eine Subfunktion und will die 2 Datensätze aus der Subfunktion an ein 2 Arrays hängen. Wie mach ich das?

for my $i (0..5){
$age[$i]=int(rand(10)
$gender=0
}

$n=10
sub birth{
for my $i (0..$n){
$birthage[$i]=0;
$birthgender[$i]=1;
}
return @birthage;
return @birthgender;
}

push (@age, @birthage); #hier will ich Arrays verknüpfen
push (@gender, @birthgender);

Wie greife ich denn auf die Arrays @birthage und @birtgender zu?
Ok...ich könnte die Sub-Funktion weglassen, aber mein Programm ist ja etwas länger und wegen der Übersichtlichkeit wäre es schon besser mit sub.

Hab noch nicht allzu viel Programmiererfahrung, also seit bitte nachsichtig mit mir! Danke schon mal für die Tipps.
nepos
 2008-01-02 16:16
#104341 #104341
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Du könntest die beiden Arrays als Referenzen an die Sub übergeben und die neuen Einträge direkt in deiner Sub hinzufügen:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
sub birth {
  my ($birthage, $birthgender) = @_;
  for my $i ( 0..$n) {
    push(@$birthage, 0);
    push(@$birthgender, 1);
  }
}

birth(\@age,\@gender);


Wobei $gender bei dir eh kein Array ist. Problem an deiner Sub ist auch, dass diese nur @birthage zurückgibt. Das return beendet die Sub und dein @birthgender wird nie zurückgeliefert.
Alvin
 2008-01-02 16:37
#104343 #104343
User since
2007-12-28
9 Artikel
BenutzerIn
[default_avatar]
Sorry gender soll auch ein Array sein. Semikolons fehlen auch

for my $i (0..5){
$age[$i]=int(rand(10);
$gender[$i]=int (rand (1))
}

also ich wollte folgendes erreichen:

in @age soll per Zufall stehen 3 2 5 1 7 8 ,also z.B. 6 Tiere mit alter 3 2 5 1 7 8
und 2 Geschlechter 0=weiblich 1=männlich

so dass Tier [$i=0] z.B. 3 Jahre alt ist und Geschlecht 1 (männlich)

so und nun sollen neue Tiere geboren werden 10 Stück und dennen verpasse ich allen das Alter birthage 0 und Geschlecht 1

das Alter und Geschlecht dieser neuen Tiere möchte ich mit dem Alter und Geschlecht der alten Tieren verbinden. so das ich da stehen habe:
Alter Geschlecht
3 1
2 1
5 0
1 0
7 1
8 0
0 1
0 1
0 1
0 1
0 1
0 1
0 1
0 1
0 1
0 1


nepos
 2008-01-02 18:41
#104348 #104348
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hm, du könntest das auch so machen:
Code (perl): (dl )
1
2
3
4
5
6
7
8
sub birth {
    my (@birthage, @birthgender);
    for my $i (0..$n){
        $birthage[$i]=0;
        $birthgender[$i]=1;
    }
    return(\@birthage, \@birthgender);
}


Dadurch liefert deine Funktion einen Array mit zwei Referenzen auf die Arrays mit dem Alter und dem Geschlecht zurück.
Dann musst du beim Pushen nur noch den Array dereferenzieren:
Code (perl): (dl )
1
2
3
my ($age_ref, $gender_ref) = birth();
push(@age, @$age_ref);
push(@gender, @$gender_ref);
topeg
 2008-01-03 01:42
#104353 #104353
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Code (perl): (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
# mehr/ausführlichere Fehlermeldungen
# --> besseres Programm
use strict;
use warnings;
##################################
# Funktionen #######################
##################################
sub birth{
  # variable von Funktionsaufruf übernehmen
  my $count=shift(@_);
  my @birthage;
  my @birthgender;
  for my $i (0..$count){
     $birthage[$i]=0;
     $birthgender[$i]=1;
  }
  #Referenzen übergeben
  return (\@birthage,\@birthgender);
}
##################################
# Programm ########################
##################################

# Variablem bitte initialisieren.
my @age;
my @gender;
my $n=10;

for my $i (0..5){
  $age[$i]=int(rand(10));
  $gender[$i]=int (rand (1));
}

# Funktion ausführen
my ($birthage,$birthgender)=birth($n);

# zu den Arrays hinzufügen
push (@age, @$birthage);
push (@gender, @$birthgender);
Alvin
 2008-01-04 18:14
#104405 #104405
User since
2007-12-28
9 Artikel
BenutzerIn
[default_avatar]
Danke für die Tipps hat super geklappt! Mal noch ne Frage

@$birthage wie nennt man denn sowas? Array und Skalar ist klar. Aber in der Form hab ich es jetzt zum ersten mal gesehen. Bin halt ein newbie.
RPerl
 2008-01-04 18:56
#104406 #104406
User since
2006-11-26
384 Artikel
BenutzerIn

user image
Dereferenzierung.
perldoc perlref

Bsp.:

Code (perl): (dl )
1
2
3
4
5
6
7
my $value = 5;
my $val_ptr = \$value;
print $$val_ptr; # der wert wird wiedergegeben

my @value = qw(1 2 3);
my $val_ptr2 = \@value;
print @$val_ptr2; # die werte aus'm array wird wiedergegeben
renee
 2008-01-04 19:59
#104408 #104408
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Siehe auch 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/
Linuxer
 2008-01-04 20:12
#104409 #104409
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Hi,

int( rand(1) ) ist eigentlich schlecht geeignet, um per Zufall eine 0 oder eine 1 zu generieren.
rand(EXPR) generiert einen Wert größer oder gleich Null und kleiner als EXPR.
Somit kann bei EXPR=1 nach dem int() keine 1 mehr auftauchen und das Ergebnis wäre immer 0.

Mögliche Variationen wären:

Code (perl): (dl )
1
2
3
int(rand(2));
int(rand(1)+0.5);
int(rand($beliebiger_wert))%2;


perldoc -f rand
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
Dubu
 2008-01-07 02:21
#104448 #104448
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Linuxer+2008-01-04 19:12:08--
Code (perl): (dl )
int(rand($beliebiger_wert))%2;


Aber bitte nur, wenn $beliebiger_wert sehr, sehr hoch oder gerade ist. ;-)
Nein, besser nur, wenn $beliebiger_wert gerade ist. Sonst ist die Wahrscheinlichkeit für 0 und 1 nicht mehr gleich.
<< >> 10 Einträge, 1 Seite



View all threads created 2008-01-02 16:04.