Προγραμματισμός με gawk μέρος 2ο: Εντολές ελέγχου ροής
Description: This is issue 24 of Magaz, the Hellenic LinuxMagazine
Keywords: magaz hellenic greek hellas greece hellug linux magazine

Magaz, The Greek Linux Magazine
Τεύχος #24
Περιληπτικά Περιεχόμενα Αναλυτικά Περιεχόμενα Mirrors Links Πληροφορίες Συντάκτες Αναζήτηση Επικοινωνία
Επόμενο Προηγούμενο Περιεχόμενα ### 3. Εντολές ελέγχου ροής ### 3.1 If Απο τη φύση της, η gawk έχει την εξής μορφή: αν το πρότυπο ικανοποιείται, τότε εκτελείται η πράξη. Φυσικά, έχετε τη δυνατότητα να γράψετε ένα πρόγραμμα με "υποθετική ροή". Αυτό μπορείτε να το κάνετε, φυσικά, με το if. Η γενική δομή του if έχει ως εξής:
    if (υπόθεση)
     εντολή που εκτελείται αν η υπόθεσή μας είναι αληθινή
    else
     εντολή που εκτελείται αν η υπόθεσή μας δεν είναι αληθινή
Η υπόθεσή μας μπορεί να είναι οποισδήποτε συνδυασμός προτύπων από αυτά που είπαμε στο 1ο μέρος. Τώρα, αν θέλετε να εκτελούνται περισσότερες από μία εντολές, μετά τον έλεγχο αληθείας της υπόθεσης, τότε θα πρέπει να "περικυκλώσετε" τις εντολές με αγκύλες ({ }), ακριβώς όπως και στη C. Μπορείτε να χρησιμοποιήσετε πολλά if στη σειρά (και μετά από ένα else) με τον εξής τρόπο:
    if ("Linux" in magaz_subject)
       print "We are studying Linux :-)"
    else if ("gawk" in magaz_subject)
       print "We are studying awk :-)"
    else
       print "We are doing nothing :-("
### 3.2 Υποθετικός τελεστής Η gawk σας παρέχει με αυτόν τον τελεστή, ο οποίος αποτελείται από τρείς παραμέτρους, τη δυνατότητα να εφαρμόζετε if-ελέγχους ανά πάσα στιγμή μέσα στο πρόγραμμά σας. Η μορφή του είναι η εξής:
    υπόθεση ? αποτέλεσμα σε περίπτωση αλήθειας : εναλλακτικό αποτέλεσμα (σε μη-αληθινή περίπτωση)
Αυτός ο τελεστής καθιστά τα προγράμματά σας πιο ευανάγνωστα. Ας δούμε ένα παράδειγμα χρήσης του παραπάνω τελεστή σε περίπτωση όπου ανάλογα με τον αριθμό των αρχείων που αντιγράφηκαν, θέλουμε πληθυντικό ή ενικό:
    { print $1, "αρχεί" $1 != 1 ? "α αντιγράφηκαν" : "ο αντιγράφηκε" }
Αν θα θέλαμε να γράψουμε το παραπάνω, χρησιμοποιώντας το if, τότε θα γράφαμε:
    if ( $1 != 1 )
       print $1, "αρχεία αντιγράφηκαν"
    else
       print $1, "αρχείο αντιγράφηκε"
### 3.3 βρόγχοι H awk υποστηρίζει τους βρόγχους do, for και while, όπως ακριβώς αυτοί συντάσσονται στην C. Μια γενική συμβουλή (για όλους τους βρόγχους) είναι να μην ξεχνάτε να χρησιμοποιείτε αγκύλες ({ }) όταν θέλετε μέσα στο βρόγχο να εκτελέσετε πάνω από μία εντολές. Ένα λάθος που γίνεται συχνά είναι ακριβώς αυτό, να ξεχνάει κανείς τις αγκύλες. #### Do Ο βρόγχος do (συνήθως καλείται και do-while) αποτελείται από δύο μέρη: τις εντολές που θέλουμε να εκτελέσουμε και τον (υποθετικό) έλεγχο. Προσέξτε πως αυτός ο βρόγχος έχει το χαρακτηριστικό να εκτελούνται οι εντολές που του δηλώνουμε τουλάχιστον μία φορά, καθώς ο υποθετικός έλεγχος που "επιβάλλουμε" αναγράφεται μετά την δήλωση των εντολών. Για να το καταλάβετε καλύτερα, ας δούμε τη σύνταξη του do:
    do
       εντολές
    while (υπόθεση)

    π.χ:

    do
       print "Magaz kicks!!"
    while ($1 != 1)
Το μήνυμα της print θα εκτελείται μέχρι το πρώτο πεδίο ($1) να πάρει την τιμή 1. Όμως, ακόμα και αν το $1 "ξεκινάει" με αρχική τιμή 1, τότε το μήνυμα θα τυπωθεί. Απλά, όταν θα γίνει ο έλεγχος και "ικανοποιηθεί" η while, δεν θα ξαναγυρίσουμε στο do, αλλά το πρόγραμμα θα προχωρήσει στις τυχόν παρακάτω εντολές. #### For O βρόγχος for είναι ένας πασίγνωστος βρόγχος στις γλώσσες προγραμματισμού. Ας δούμε κατ' ευθείαν την σύνταξή του για να καταλάβουμε τη λειτουργία του:
    for (i = 0; i < 100; i++)
       {
        εντολή 1
        εντολή 2
       }
Παραπάνω, οι εντολές του βρόγχου θα εκτελεστούν 100 φορές!! Ας δούμε γιατί: Αρχικά, ορίζουμε μιά μεταβλητή, την i, η οποία θα μας χρησιμεύσει απλά και μόνο για το πόσες φορές θα εκτελεστεί ο βρόγχος, και δίνουμε στην i την τιμή 0. Μετά, η for κοιτάει τη 2η δήλωση στην παρένθεση (οι δηλώσεις, υπενθυμίζω, χωρίζονται με ;) και κάνει τον υποθετικό έλεγχο. Στην περίπτωσή μας, ελέγχεται αν η τιμή της μεταβλητής i είναι μικρότερη από 100 και αν είναι, τότε εκτελούνται οι εντολές που καθορίσαμε. Μετά (και εδώ φαίνεται η "δυναμη" της for), δεν χρειάζεται να "κανονίσουμε" εμείς την μεταβλητή i, αλλά έχουμε δηλώσει η i να αυξάνεται κατά 1. Η for λοιπόν, αυξάνει την τιμή της i και ξαναρχίζει: κάνει τον έλεγχο, εκτελεί της εντολές, αυξάνει την i κ.ο.κ. ... Όταν, λοιπόν, η i θα αποκτήσει την τιμή 100, τότε δεν θα εκτελεστούν οι εντολές, καθώς το αποτέλεσμα του ελέγχου 100 < 100 είναι ψευδές (το 100 δεν είναι μικρότερο από το 100 !! :) #### While Ο βρόγχος while είναι αρκετά απλός και μάλλον θα έχετε ήδη καταλάβει πως λειτουργεί (από το βρόγχο do-while). Σε αντίθεση με την do, οι εντολές εκτελούνται μόνο αν το αποτέλεσμα του υποθετικού ελέγχου, ο οποίος γίνεται στην αρχή του βρόγχου, είναι αληθής. Ας δούμε τη σύνταξή του:
    while (υπόθεση)
      εντολή(ες και μήν ξεχάσετε τις αγκύλες :)
Γενικά, για τους βρόγχους, να έχετε υπ' όψιν πως μέσα στις εντολές του βρόγχου, η μεταβλητή πάνω στην οποία γίνεται ο υποθετικός έλεγχος, πρέπει να αλλάζει, αλλιώς ο βρόγχος μας δεν τελειώνει ποτέ !!! (ατέρμων βρόγχος) #### Έλεγχος στους βρόγχους Όπως και στις υπόλοιπες γλώσσες προγραμματισμού, έτσι και στην awk, έχετε τη δυνατότητα να "βγείτε" από έναν βρόγχο (loop), "νωρίτερα από το κανονικό", δηλαδή χωρίς να "ικανοποιηθεί" κάποιος υποθετικός έλεγχος και τερματίσει ο βρόγχος. Αυτό μπορείτε να το κάνετε με δύο εντολές: την break και την continue. Με την εντολή break *ΑΚΑΡΙΑΙΑ* τερματίζετε τον βρόγχο και, φυσικά, όσες εντολές ακολουθούν την break *ΜΕΣΑ* στον βρόγχο, δεν εκτελούνται, αλλά το πρόγραμμα θα συνεχίσει, εκτελώντας τις εντολές που τυχόν βρίσκονται μετά τον βρόγχο. Η εντολή break είναι σαν να εκτελείτε εκείνη την στιγμή τον υποθετικό έλεγχο του βρόγχου, αλλά το αποτέλεσμα *ΒΕΒΙΑΣΜΕΝΑ* (από την break) είναι μή αληθές (FALSE). Αντίθετα, η εντολή continue αναγκάζει τον βρόγχο να εκτελέσει τον υποθετικό του έλεγχο. Όσες τυχόν εντολές βρίσκονται μετά την continue (μέσα στο βρόγχο) δεν εκτελούνται. Η continue δεν είναι σίγουρο πως θα "τερματίσει" το βρόγχο, αν το αποτέλεσμα του βρόγχου είναι αληθές (TRUE), τότε ο βρόγχος θα συνεχίσει να εκτελείται. Η continue είναι ιδιαίτερα χρήσιμη αν θέλετε (για κάποιο λόγο, για κάποια συνθήκη) να "παρακάμψετε" κάποιες εντολές του κώδικα. Επόμενο Προηγούμενο Περιεχόμενα