oder:
Innen: for my $i (reverse( 0 .. $#population)) {
"reverse" dreht die Liste um.
wenn du Interesse hast, dein Programm mal etwas anders geschrieben:
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#!/usr/bin/perl
use strict;
use warnings;
#USAGE: ./alvin.pl 6 3
# die Ausgabe in einer eigenen Funktion
# dann schreibt man es nicht unnötig doppelt.
sub show_person
{
my $person=shift(@_);
my $age=$person->{age}; # Wert aus einer Hashreferenz lesen.
my $gender=$person->{gender};
my $weight=$person->{weight};
print "$age\t$gender\t$weight\n";
}
# $wert=(<bedingung>)?$a:$b ist gleich zu if(<bedingung>){$wert=$a}else{$wert=$b}
my $init_popsize = $ARGV[0] ? $ARGV[0] - 1 : 10 ; # wenn keine Angabe dann 10 annehmen
my $maxtime = $ARGV[1] ? $ARGV[1] : 10; # wenn keine angabe dann 10 Durchläufe machen
my @population;
for my $i (0..$init_popsize)
{
my $age=int( rand(10) );
my $gender=1; #Geschlecht (0=männlich, 1=weiblich)
$gender=0 if( rand(1) <= 0.4); # einen if-Zweig gespart.
my $random=rand(1);
my $weight=2;
if ( $random <= 0.3 )
{ $weight=0; }
elsif ( $random > 0.3 && $random <= 0.6 )
{ $weight=1; }
my %person=(age=>$age, gender=>$gender, weight=>$weight); # ein Hash der alle werte enthält
push(@population,\%person); # Referenz auf den Hash ans Array anhängen
show_person(\%person);
}
print "\n";
Aussen: for my $t ( 1 .. $maxtime )
{
print "\nTIME: $t\n";
Innen: for my $i (reverse( 0 .. $#population ))
{
my $person=$population[$i]; # referenz aus dem Array lesen
$person->{age}++;
splice( @population, $i, 1 ) if($person->{age} >= 10);
}
for my $person (@population) # hier kann man das array so durchlaufen lassen
{ show_person($person); }
print "population: ".@population."\n"; # im Skalarkontext gibt @array die Anzahl der enhaltenen Elemente zurück.
}
Alle Daten in einem Hash zu speichern mach das ganze doch übersichtlicher.