SchleifenPerl

SeitenanfangSeitenendefor und foreach bei Arrays

Wird ein Array mit Hilfe einer for-Schleife durchlaufen, wobei auf die Elemente über die Indizes (z. B. @array[$i]) zugegriffen wird, dann muss Perl zuerst die Indizes auswerten und kann erst dann auf den Inhalt zugreifen. Mittels der foreach-Schleife wird einfach das Array durchlaufen. Wenn es also möglich ist ein Array über letztere Schleife zu durchlaufen, dann sollte man auf diese zurückgreifen. Ich hab's getestet - es stimmt - bemerkbar wird es aber erst, wenn man öfter darauf zurückgreift. Verwendet man in der foreach-Schleife $_ statt einer anderen Laufvariablen, dann wird es noch einmal etwas schneller.

Bemerkung: Statt for kann man auch foreach schreiben! Es kommt darauf an was danach kommt!

SeitenanfangSeitenendeSchleife statt Rekursion

Einen Fall haben wir schon kennengelernt - bei der Berechnung der Fakultät:

print "Berechne die Fakultaet einer Zahl >> ";
chomp($zahl=<STDIN>);

print $zahl."! = ".fakultaet($zahl).".\n";


###SUBS####

### fakultaet(Zahl)
# bestimme die Fakultaet einer Zahl
sub fakultaet{
  my $n=$_[0];

  if ($n<=1) {
    1; # gebe 1 zurueck
  }
  else {
    $n*fakultaet($n-1); # (*)
    # das ist die Rekursion; es wird
    # $n * die Fakultaet von n-1
    # berechnet und zurueckgegeben
  }
}

Besser und schneller (Faktor 3) ist:

print "Berechne die Fakultaet einer Zahl >> ";
chomp($zahl=<STDIN>);

print $zahl."! = ".fakultaet($zahl).".\n";


###SUBS####

### fakultaet(Zahl)
# bestimme die Fakultaet einer Zahl
sub fakultaet{
  my $n=$_[0];
  my $fakult=1;

  for (local $i=2; $i<=$n;$i++) {
    $fakult*=$i;
  }

  $fakult;
}

SeitenanfangSeitenendewhile-Schleife und Rhombus-Operator

Als nächstes sei hier eine Möglichkeit aufgezeigt, Files einzulesen. Man braucht dazu die while-Schleife und den Rhombus-Operator <>:

# getContent.pl

while (<>) {
  print;
}

Dieses kurze Programm liest Files zeilenweise ein und gibt diese an die Standardausgabe aus. Welche Files - die, die man beim Programmaufruf mit übergibt (hier file1.txt, file2.txt und file3.txt):

perl getContent.pl file1.txt file2.txt file3.txt

Der Rhombus-Operator arbeitet das Array @ARGV ab! Während des Programms kann das Array @ARGV verändert werden - das ist aber nur in bestimmten Fällen ratsam - , um den Rhombus-Operator die geeigneten Filenamen zuzuspielen.

Der Rhombus-Operator kann auch in anderen Fällen eingesetzt werden - man muss nur wissen, dass dieser Operator eben die Files in @ARGV abarbeitet (das heißt aus dem Array @ARGV immer das erste Element ausliest und löscht.): Zum Beispiel ist folgendes möglich, um Zeilen (der Files aus @ARGV) sortiert auszugeben:

print sort <>;

Seitenanfang FehlermeldungHilfe zur Fehlermeldung © 2001-2003 Email an den AutorPerl, Lehrstuhl Mathe II, Uni Bayreuth