7. Kontrola przepływu
Perl ma wszystkie struktury kontroli przepływu, które są w normalnym
języku procedur, jak również kilka dodatkowych.
7.1. If-Then-Else
W Perlu jest podobnie jak w C. Używa się tu tych samych operatorów: "&&"
to "i", "||" - lub, "!" zaś to negacja. Jedyna różnica jest brak
jednolinijkowego wykonania warunku. To znaczy zamiast:
if (error < 0)
fprintf(stderr,"Blad o kodzie %d\n",error);
należy w Perlu zapisać:
if ($error < 0)
{ print STDERR "Błąd o kodzie $error\n"; }
Natomiast odpowiednikiem dwóch słów w C else if jest w Perlu słowo
elsif, poza tym istnieje słowo przeciwstawne unless. Na przykład:
unless ($#ARGV > 0) # czy są jakieś argumenty
{ print "Błąd, brak argumentow\n"; exit 1; }
Idea wartości logicznych jest identyczna do C. Zero to fałsz, nie zero
prawda. Pusty ciąg znaków - fałsz, o długości 1 lub więcej - prawda.
Wektory i ich skojarzone odpowiedniki o ilości elementów 0 - fałsz,
więcej - prawda. Nie istniejące zmienne, maja z definicji wartość zero,
czyli fałszu. W Perlu nie istnieje konstrukcja case, lecz zamiast niej
są inne.
7.2. Konstrukcja while
W Perlu while ma różnorakie zastosowania. Na przykład warunkiem może być
wywołanie funkcji (wyświetlanie tekstu wpisanego z klawiatury):
while (<STDIN>)
{
print "wpisałeś ",$_;
}
Powyższy kod napisany przez początkującego powinien wyglądać
następująco:
while ($_ = <STDIN>)
{
print "wpisałeś ",$_;
}
Poniżej przykład na wartość logiczna wektora:
@users = ("nigel","david","derek","viv");
while (@users)
{
$user = shift @users;
print "$user ma konto\n";
}
Pętla while będzie wykonywana dopóki @users będzie miał choć jeden
element. Funkcja shift zwraca pierwszy element z @users i wyrzuca go z
wektora @users. Ponadto można używać next - odpowiednika continue z C,
oraz last - break.
7.3. Konstrukcja for i foreach
Te konstrukcje w Perlu są równoważne. Zasadniczo są dwa sposoby użycia
for/foreach. Pierwszy, podobny do C:
@disks = ("/data1","/data2","/usr","/home");
for ($i=0; $i <= $#disks; ++$i)
{ print $disks[$i],"\n"; }
Jeśli się zrozumie wbudowana zasadę iteracji wektorów w Perlu nie będzie
potrzeby używania powyższej konstrukcji. Jednoargumentowe wywołanie
foreach jest podobne jak w C shellu. Jest tu wyraźna różnica pomiędzy
odpowiednią konstrukcją while - shift, która kolejno wyrzuca elementy z
wektora. Dla przykładu odpowiednik powyższego kodu :
@disks = ("/data1","/data2","/usr","/home");
foreach(@disks)
{ print $_,"\n"; }
Należy zauważyć jest to bardziej zwięzłe i nie niszczy zawartości
@disks, poza tym $_ jest wskaźnikiem, a nie kopią, zatem jeśli w kodzie
zmienimy $_ to zmieni się także wektor.
7.4. GOTO
Konstrukcja goto etykieta - skieruje bieg programu do określonej
etykiety. Podobnie jak w innych językach nie zaleca się stosować goto.