Το σύνολο των γραμμών κώδικα που εμπεριέχονται μέσα σε δύο άγκιστρα αποκαλούνται block. Όποιες μεταβλητές ορίσουμε μέσα στο block υπάρχουν και ισχύουν μόνο μέσα σε αυτό και θεωρούνται άγνωστες και ανύπαρκτες για το υπόλοιπο πρόγραμμα.
Η γενική σύνταξη ενός block είναι:
Αν ισχύει αυτό τότε εκείνο
Για παράδειγμα:
if [αν] ($forc eq 'f') [αυτό] τότε
{$cen = int(($temp-32)*5/9);
print "The equivalent of $temp degrees Fahrenheit is $cen Centigrade\n";
} [εκείνο]
Χρησιμοποιώντας τον τελεστή while μια εργασία (το block που ορίζεται από αυτόν) θα εκτελείται για όσο χρονικό διάστημα μια τιμή είναι αληθής. Αντίθετα με τον τελεστή until μια εργασία θα εκτελείται μέχρι κάποια προκαθορισμένη τιμή να είναι αληθής.
Το πρόγραμμα
Ένα από τα μειονεκτήματα του προγράμματος μετατροπής θερμοκρασίας είναι ότι μπορεί να χρησιμοποιηθεί μόνο μια φορά. Αν θέλουμε να μετατρέψουμε μια σειρά από τιμές θα πρέπει για κάθε μια να ξεκινούμε το πρόγραμμα από την αρχή. Αυτό που θέλουμε είναι το πρόγραμμα να μπορεί να χρησιμοποιηθεί επαναλαμβανόμενες φορές μέχρι εμείς να του πούμε ότι δεν το χρειαζόμαστε άλλο.
#!/usr/bin/perl -w
use strict;
print "Welcome to the Fahrenheit - Centigrade script\n";
Κατά τα γνωστά.
my $quit = 0;
until ($quit) {
Για την Perl μια τιμή είναι ψευδής όταν περιέχει 0 (μηδέν), κενό ή αν είναι άδεια. Σε όλες τις άλλες περιπτώσεις είναι αληθής. Στην περίπτωσή μας ορίσαμε τη μεταβλητή $quit την οποία θα χρησιμοποιήσουμε για να μας δηλώνει ο χρήστης πότε θέλει να διακόψει τη χρήση του προγράμματος. Ορίζουμε από την πρώτη στιγμή την τιμή της quit ως 0 (δηλαδή ψευδής). Όταν αλλάξει τότε το πρόγραμμα θα σταματήσει να λειτουργεί.
print "Please type the temperature you want to convert or q to quit:\n";
my $fah; # Oi bathmoi se Fahrenheit
my $cen; # Oi bathmoi se Kelsiou
my $temp; # Temperature
my $forc; # f if Fahrenheit or c if Centigrade
chomp ($temp = <STDIN>);
if ($temp eq 'q') {
$quit =1;
}
Διαφορετικές από τα προηγούμενα είναι μόνο οι δύο τελευταίες γραμμές οι οποίες μας λένε ότι αν ο χρήστης πληκτρολογήσει q τότε η $quit γίνεται ίση με 1 άρα η τιμή της είναι αληθής και η until θα τερματιστεί. Προσέξτε επίσης ότι αλλάξαμε την αφαίρεση του Enter από την πληκτρολόγηση του χρήστη. Αντί για
$temp = <STDIN>;
chomp ($temp);
τώρα έχουμε
chomp ($temp = <STDIN>);
Ένα από τα βασικά ρητά της Perl είναι το: There is more than one way to do it. Εδώ βλέπουμε μια πολύ απλή εφαρμογή αυτού του ρητού.
elsif ($temp =~ m/^\d+$/) {
Ένα πρόγραμμα πρέπει να λειτουργεί σωστά όχι μόνο κάτω από φυσιολογικές συνθήκες, αλλά κάτω από οποιεσδήποτε περιστάσεις. Έτσι, είμαστε υποχρεωμένοι να προβλέψουμε και να διαχειριστούμε ακόμη και τα πιο ανορθόδοξα πράγματα. Ο καλύτερος τρόπος για να το κάνουμε αυτό είναι να ελέγχουμε με ποιο τρόπο οι χρήστες επικοινωνούν με τις εφαρμογές μας.
Στην προκειμένη περίπτωση το πρόγραμμα θα λειτουργήσει μόνο αν ο χρήστης δώσει κάποιον θετικό αριθμό. Για να το επιτύχουμε αυτό χρησιμοποιούμε τον match operator της Perl η γενική σύνταξη του οποίου είναι m// μέσα στα // τοποθετούμε τα κριτήρια αποδοχής που επιθυμούμε. Στην προκειμένη περίπτωση αυτά είναι:
Το \d Σημαίνει «ταίριαξε οποιοδήποτε ψηφίο» (αλλά μόνο ένα). Προσθέτοντας και ένα + αυτό γίνεται \d+ και σημαίνει ταίριαξε μια σειρά από ένα ή περισσότερα ψηφία.
Το ^ όταν τοποθετείται στην αρχή μιας ακολουθίας το ^ σημαίνει «ταίριαξε την αρχή της ακολουθίας».
Το $ Σημαίνει «ταίριαξε το τέλος της ακολουθίας».
Συνεπώς το =~ m/^\d+$ σημαίνει Ταίριαξε από την αρχή και πέρα (^) μόνο ψηφία (\d+) και ταυτόχρονα ταίριαξε από το τέλος και προς τα εμπρός ($)μόνο ψηφία (\d+). Προφανώς, αυτό σημαίνει ότι για να είναι αληθής η τιμή πρέπει ο χρήστης να πληκτρολόγησε μόνο ψηφία (δηλαδή αριθμούς). Έτσι εξασφαλίζουμε ότι ο χρήστης δεν πληκτρολογήσει κατά λάθος γράμματα ή κάτι άλλο στη θέση της θερμοκρασίας.
print "Type f if what you typed is in Fahrenheit or c if it is in Centigrade:\n";
chomp ($forc = <STDIN>);
Ο χρήστης δηλώνει f ή c ανάλογα με τι αντιπροσωπεύει το νούμερο που έδωσε προηγουμένως.
if ($forc eq 'f') {
$cen = int(($temp-32)*5/9);
print "The equivalent of $temp degrees Fahrenheit is $cen Centigrade\n";
}
Υπολογισμός θερμοκρασίας σε Κελσίου.
elsif ($forc eq 'c') {
$fah = int($temp*9/5+32);
print "The equivalent of $temp degrees Centigrade is $fah Fahrenheit\n";
}
Υπολογισμός θερμοκρασίας σε Fahrenheit.
else {
print "You should have typed f or c. Restarting program\n";
}
Ο χρήστης πληκτρολόγησε κάτι διαφορετικό από f ή c, γι αυτό και το πρόγραμμα τυπώνει απλώς το μήνυμα διαμαρτυρίας και αφού φθάσαμε στο τέλος του block (f ή c ή κάτι άλλο) το πρόγραμμα θεωρεί ότι ολοκλήρωσε την εργασία του και θα ξεκινήσει από την αρχή.
}
else {
print "You should have typed q (for quit) or a valid equal or greater than zero integer. Restarting program\n";
}
Φθάσαμε στο τέλος του block (q ή ακέραιος μεγαλύτερος ίσος του μηδενός ή κάτι άλλο) το πρόγραμμα θεωρεί ότι ολοκλήρωσε την εργασία του και θα ξεκινήσει από την αρχή.
}
print "Thank you for using this program\n";
Το πρόγραμμα τελειώνει με ένα αποχαιρετιστήριο μήνυμα.
Σε περίπτωση που θέλουμε να χρησιμοποιήσουμε την while αντί για την until τότε οι αλλαγές στο πρόγραμμα θα είναι:
my $quit = 1;
while ($quit) {
αντί για:
my $quit = 0;
until ($quit) {
και:
if ($temp eq 'q') {
$quit =0;
αντί για:
if ($temp eq 'q') {
$quit =1;
(αλλάζει μόνο η τιμή της $quit, αλλά γράφω και την από πάνω γραμμή για να την βρείτε πιο εύκολα στον κώδικα).
Το πλήρες πρόγραμμα (με while αντί για until) έχει την ακόλουθη μορφή:
#!/usr/bin/perl -w
use strict;
print "Welcome to the Fahrenheit - Centigrade script\n";
my $quit = 1;
while ($quit) {
print "Please type the temperature you want to convert or q to quit:\n";
my $fah; # Oi bathmoi se Fahrenheit
my $cen; # Oi bathmoi se Kelsiou
my $temp; # Temperature
my $forc; # f if Fahrenheit or c if Centigrade
chomp ($temp = <STDIN>);
if ($temp eq 'q') {
$quit =0;
}
elsif ($temp =~ m/^\d+$/) {
print "Type f if what you typed is in Fahrenheit or c if it is in Centigrade:\n";
chomp ($forc = <STDIN>);
if ($forc eq 'f') {
$cen = int(($temp-32)*5/9);
print "The equivalent of $temp degrees Fahrenheit is $cen Centigrade\n";
}
elsif ($forc eq 'c') {
$fah = int($temp*9/5+32);
print "The equivalent of $temp degrees Centigrade is $fah Fahrenheit\n";
}
else {
print "You should have typed f or c. Restarting program\n";
}
}
else {
print "You should have typed q (for quit) or a valid equal or greater than zero integer. Restarting program\n";
}
}
print "Thank you for using this program\n";