Πρώτο commit
Αυτό το commit περιλαμβάνεται σε:
commit
8ec8e9bee2
451 αρχεία άλλαξαν με 46736 προσθήκες και 0 διαγραφές
46
content/articles/24/01_editorial.md
Κανονικό αρχείο
46
content/articles/24/01_editorial.md
Κανονικό αρχείο
|
@ -0,0 +1,46 @@
|
|||
+++
|
||||
title = 'Editorial'
|
||||
date = '2000-04-01T00:00:00Z'
|
||||
description = ''
|
||||
author = 'Μιχάλης Καμπριάνης(mailto:kabrianis@hellug.gr)'
|
||||
issue = ['Magaz 24']
|
||||
issue_weight = 1
|
||||
+++
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
*Καλώς ορίσατε στο **Magaz**\... Τεύχος Παράδοσης / Παραλαβής*
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
Γεια σας, για τελευταία φορά από μένα από αυτό το βήμα, του αρχισυντάκτη. Από το επόμενο τεύχος, ο αρχισυντάκτης του περιοδικού αλλάζει, και εγώ μετατρέπομαι σε
|
||||
απλό αρθρογράφο.\
|
||||
Λίγες εξηγήσεις για αυτό, νομίζω ότι σας τις οφείλω. Από ιδρύσεως του Magaz, δηλαδή, το 1ο τεύχος που βγήκε τον Ιανουάριο του 1998, και μέχρι και αυτό το τεύχος
|
||||
(24o, Μάιος του 2000), αρχικά ανεπίσημα και στη συνέχεια επίσημα (εκ των πραγμάτων βέβαια), είχα την ευθύνη αρχισυνταξίας του Magaz. Αν και πίστευα ότι δεν
|
||||
χρειάζεται να υπάρχει αρχισυντάκτης, από τα πράγματα αποδείχτηκε ότι αυτός που \"κυνηγάει\" τους αρθρογράφους, συντονίζει τι άρθρα θα γράψουν, τα στέλνει στον
|
||||
διορθωτή, φτιάχνει τις σελίδες, τις \"μοιράζει\" στα mirrors και πολλά άλλα, είναι ένας άτυπος έστω αρχισυντάκτης. Αυτή η ιστορία με έχει κουράσει πλέον. Όπως
|
||||
θα έχετε παρατηρήσει, τα άρθρα μου (πλην του editorial) συνεχώς μειώνονται στο περιοδικό. Αυτό είναι κάτι που δεν ήθελα να συμβεί. Συμβαίνει όμως, λόγω ελλείψης
|
||||
χρόνου. Αισθάνομαι ότι υπηρέτησα καλά το Magaz από αυτή τη θέση, τα δυόμιση αυτά χρόνια. Η αλήθεια είναι ότι δεν το παραδίδω και στην καλύτερη κατάσταση, έχει
|
||||
όμως δυναμική.
|
||||
|
||||
Προφανώς θα συνεχίσω να είμαι τριγύρω, κυρίως γράφοντας άρθρα πλέον, εκμεταλλευόμενος τον χρόνο που θα εξοικονομήσω από την αρχισυνταξία, αλλά και σαν βοηθός
|
||||
του νέου αρχισυντάκτη, αντικαθιστώντας τον όποτε χρειάζεται (σε δυό μήνες ας πούμε που θα παντρευτεί, πάλι εγώ θα βγάλω το τεύχος).
|
||||
|
||||
Αναλαμβάνει νέος αρχισυντάκτης ο παλιότερος τακτικός συνεργάτης του περιοδικού που παραμένει ενεργός (μία ευνόητη και φυσιολογική εξέλιξη νομίζω), ο [Βαγγέλης
|
||||
Παπαδογιαννάκης](mailto:papas@hellug.gr). Τα άρθρα του συνήθως είναι πρώτα από πλευράς αναγνωσιμότητας σε όποιο τεύχος συμμετέχουν σύμφωνα με τα στατιστικά μας,
|
||||
ενώ έχει και το ρεκόρ να έχει γράψει το άρθρο με την μεγαλύτερη αναγνωσιμότητα που εμφανίστηκε στο Magaz από τότε που κρατάμε στατιστικά (το Enlightenment του
|
||||
τεύχους 14). Ο Βαγγέλης έχει μεταξύ των άλλων και τις τεχνικές γνώσεις να διορθώσει τυχόν προβλήματα που θα προκύψουν, και με βάση όλα τα παραπάνω φαντάζομαι
|
||||
ότι η μετάβαση θα γίνει χωρίς καν να το καταλάβετε (ή, ελπίζω, αν το καταλάβετε, θα δείτε βελτίωση).
|
||||
|
||||
Είμαι σίγουρος ότι ο Βαγγέλης θα δώσει νέα πνοή στο Magaz, ενώ περιμένω από τους μέχρι τώρα συνεργάτες του Magaz (τους οποίους και ευχαριστώ προσωπικά για την
|
||||
καλή συνεργασία που είχαμε) να τον στηρίξουν και βοηθήσουν στο δύσκολο έργο που αναλαμβάνει. Το Magaz πάντα στηριζόταν, και θα συνεχίσει να στηρίζεται, στην
|
||||
καλή θέληση και διάθεση όλων των μελών της κοινότητας να στείλουν άρθρα. Αν αυτή η διάθεση σταματήσει να υπάρχει, το Magaz απλά θα σταματήσει να βγαίνει. Είναι
|
||||
λοιπόν ευθύνη όλων μας να συνεισφέρουμε στην συνέχιση του Magaz.
|
||||
|
||||
Να επισημάνω για άλλη μία φορά (τρίτη) ότι το Magaz δεν βγαίνει κάθε μήνα. Βγαίνει 10 φορές το χρόνο. Αυτό το λέω, για να προλάβω αντιδράσεις του τύπου \"άλλαξε
|
||||
η δομή του και εξαφανίστηκε\" :-)
|
||||
|
||||
Να στείλω τέλος, για τελευταία φορά ως αρχισυντάκτης του περιοδικού, μία πρόσκληση προς κάθε εύηκοον ους για αποστολή άρθρων.\
|
||||
Ευχαριστώ όλους που με ανεχτήκατε σε αυτό το ταξίδι των δυόμιση χρόνων. Θα τα ξαναπούμε πιστεύω, από άλλο μετερίζι. Εύχομαι στον νέο αρχισυντάκτη καλή δύναμη
|
||||
και καλή επιτυχία στο δύσκολο έργο που αναλαμβάνει.
|
||||
|
||||
Καλή ανάγνωση\...
|
236
content/articles/24/02_xbasic.md
Κανονικό αρχείο
236
content/articles/24/02_xbasic.md
Κανονικό αρχείο
|
@ -0,0 +1,236 @@
|
|||
+++
|
||||
title = 'Xbasic'
|
||||
date = '0000-04-01T00:00:00Z'
|
||||
description = ''
|
||||
author = 'Κώστας Τσακάλογλου(mailto:tsakf@hellug.gr)'
|
||||
issue = ['Magaz 24']
|
||||
issue_weight = 2
|
||||
+++
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
*Μία γλώσσα προγραμματισμού Basic που έχει αρκετά στοιχεία C. Μέρος ΙΙ*
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
Μετα από μια πρώτη ματιά και την πρώτη προσπάθεια να γράψω ένα πρόγραμμα σκέφτηκα ότι πρώτα πρέπει να εξοικειωθώ με το περιβάλλον ανάπτυξης εφαρμογών της XBASIC
|
||||
για να μπορώ να δουλέψω καλύτερα. Στο σημερινό άρθρο θα σας παρουσιάσω το περιβάλλον ανάπτυξης για να είναι κατανοητό το παράδειγμα εφαρμογής που θα γραφτεί
|
||||
μετά.
|
||||
|
||||
**1. Περιβάλλον συγγραφής του κώδικα**
|
||||
---------------------------------------------------------------
|
||||
|
||||
**2. Παράθυρο εμφάνισης αποτελεσμάτων**
|
||||
----------------------------------------------------------------
|
||||
|
||||
**3. Παράθυρο κατασκευής γραφικών αντικειμένων**
|
||||
-------------------------------------------------------------------------
|
||||
|
||||
**4. Επίλογος**
|
||||
----------------------------------------
|
||||
|
||||
|
||||
### [1. Περιβάλλον συγγραφής του κώδικα]{#s1}
|
||||
|
||||

|
||||
|
||||
Σε αυτό το παράθυρο γράφουμε τον κώδικα και έχουμε όλες τις δυνατότητες που έχουν τα σύγχρονα περιβάλλοντα προγραμματισμού. Πχ. σημεία προσωρινής παύσης
|
||||
(breakpoints), εμφάνιση τιμών μεταβλητών κ.λ.π.\
|
||||
Αναλυτικά θα δούμε τις κυριώτερες επιλογές των μενού.
|
||||
|
||||
- FileNew\
|
||||
Επιλέγεται νέο αρχείο. Διαγράφεται ότι έχει παραμείνει στην μνήμη και διακόπτεται οποιαδήποτε λειτουργία. Τα δεδομένα δεν αποθηκεύονται έτσι πρέπει να έχει
|
||||
γίνει πριν αποθήκευση αν θέλουμε να χρησιμοποιήσουμε πάλι το πρόγραμμα που μόλις είχαμε γράψει. Η επιλογή αυτή έχει μας δίνει την δυνατότητα να
|
||||
δημιουργήσουμε 3 διαφορετικούς τύπους κώδικα.
|
||||
1. Απλό αρχείο χαρακτήρων (text file)
|
||||
2. Κανονικό πρόγραμμα BASIC (χωρίς την χρήση γραφικού περιβάλλοντος)
|
||||
3. Πρόγραμμα που χρησιμοποιεί γραφικό περιβάλλον (φόρμες, κουμπιά κ.λ.π.)
|
||||
- FileTextLoad\
|
||||
Με αυτή την επιλογή μπορούμε να φορτώσουμε στο περιβάλλον αρχεία χαρακτήρων (text files) που μπορεί να μην είναι πρόγραμμα πχ. σημειώσεις. Στο περιβάλλον
|
||||
δεν υποστηρίζεται η εμφάνιση χαρακτήρων πάνω από το 128 όπου αν υπάρχουν τέτoιοι χαρακτήρες θα φαίνονται περίεργα. Επίσης στο αρχείο χαρακτήρων δεν πρέπει
|
||||
να υπάρχουν χαρακτήρες NULL. Βέβαια εδώ δημιουργείται το ερώτημα τι γινέται με τα Ελληνικα; Νομίζω όμως οτι μπορούμε να ξεπεράσουμε αυτόν τον περιορισμό αν
|
||||
τα μηνύματα του προγράμματος δεν είναι μέσα στο ν κώδικα αλλά σε αρχείο όπου θα διαβάζεται από το πρόγραμμα. Αυτός ο τρόπος δίνει επίσης την δυνατότητα να
|
||||
έχουμε διαφορετικά αρχεία για κάθε γλώσσα και έτσι νομίζω ότι ο περιορισμός του περιβάλλοντος να μην δέχεται χαρακτήρες \> 128 δεν είναι σπουδαίο πρόβλημα.
|
||||
- FileLoad\
|
||||
Φορτώνεται στο περιβάλλον ένα πρόγραμμα που εχει αποθηκευθεί από πριν.
|
||||
- FileSave\
|
||||
Αποθηκεύεται το τρέχον πρόγραμμα σε αρχείο.
|
||||
- FileMode\
|
||||
Επιλέγεται ο τρόπος λειτουργίας του περιβάλλοντος. Text mode είναι για να μπορούμε να επεξεργαζόμαστε οποιοδήποτε κείμενο ενώ το Program Mode μας δίνει τις
|
||||
ευκολίες που χρειαζόμαστε για το γράψιμο προγραμμάτων
|
||||
- FileRename\
|
||||
Το επιλέγουμε για να αλλάξουμε το όνομα του προγράμματος που έχουμε στην μνήμη.
|
||||
- FileQuit\
|
||||
Δηλώνουμε ότι θέλουμε να εγκαταλείψουμε το περιβάλλον εργασίας και άν έχουμε κάνει μεταβολές στο πρόγραμμά μας το περιβάλλον μας ζητά επιβεβαίωση και φύλαξη
|
||||
των τελευταίων αλλαγών άν θέλουμε.
|
||||
- EditCut\
|
||||
Διαγράφει καί αποθηκεύει σε προσωρική μνήμη (clipboard) το επιλεγμένο κείμενο.
|
||||
- EditGrab\
|
||||
Αντιγράφει το επιλεγμένο κείμενο στην προσωρινή μνήμη (clipboard).
|
||||
- EditPaste\
|
||||
Παρεμβάλλει στο τρέχον σημείο ότι είναι αποθηκευμένο στην μνήμη.
|
||||
- EditFind\
|
||||
Αναζήτηση κειμένου στο πρόγραμμα
|
||||
- Edit\_\_\
|
||||
Αντικατάσταση κειμένου με άλλο
|
||||
- EditRead\
|
||||
Ανάγνωση αρχείου στην προσωρινή μνήμη (clipboard).
|
||||
- EditWrite\
|
||||
Εγγραφή σε αρχείο της προσωρινής μνήμης (clipboard).
|
||||
- EditAbandon\
|
||||
Ακύρωση όλων των αλλαγών στην τρέχουσα ρουτίνα.
|
||||
- ViewFunction\
|
||||
Εμφανίζεται παράθυρο με όλες τις ρουτίνες του προγράμματος και επιλέγεται η επιθυμητή.
|
||||
- ViewPriorFunction\
|
||||
Εμφανίζεται η προηγούμενη ρουτίνα
|
||||
- ViewNewFunction\
|
||||
Δημιουργούμε μια νέα ρουτίνα και καθορίζουμε το όνομά της, παραμέτρους κλπ.
|
||||
- ViewDeleteFunction\
|
||||
Εμφανίζεται κατάλογος με όλες τις ρουτίνες και επιλέγουμε αυτήν πρός διαγραφή.
|
||||
- ViewRenameFunction\
|
||||
Δίνεται η δυνατότητα αλλαγής ονόματος της τρέχουσας ρουτίνας. Με την εντολή αλλαγής όλες οι κλήσεις σε αυτή την ρουτίνα προσαρμόζονται ανάλογα.
|
||||
- ViewCloneFunction\
|
||||
Αναπαράγεται ένα πιστό αντίγραφο κάποιας ρουτίνας.
|
||||
- ViewLoadFunction\
|
||||
Φορτώνεται μια ρουτίνα από αρχείο και ενσωματώνεται στο ήδη υπάρχον πρόγραμμα.
|
||||
- ViewSaveFunction\
|
||||
Αποθηκεύεται μια ρουτίνα σε αρχείο για την μεταφορά της όπως είναι σε άλλο πρόγραμμα.
|
||||
- Options\
|
||||
Επηρεάζεονται οι παράμετροι εμφάνισης του περιβάλλοντος και οι παράμετροι της μεταγλώττισης (Compile).
|
||||
- RunStart\
|
||||
Εκτελείται το τρέχον πρόγραμμα
|
||||
- RunContinue\
|
||||
Συνεχίζεται η εκτέλεση μετά από διακοπή της εκτέλεσης του προγράμματος.
|
||||
- RunPause\
|
||||
Διακοπή της εκτέλεσης του προγράμματος για τον έλεγχο μεταβλητών ή κλήσεων ρουτινών.
|
||||
- RunKill\
|
||||
Τερματισμός της λειτουργίας του προγράμματος και μηδενισμός μεταβλητών.
|
||||
- RunRecompile\
|
||||
Γίνεται μεταγλώττιση του προγράμματος χωρίς να εκτελεστεί για το έλεγχο λαθών σύνταξης κλπ.
|
||||
- RunAssembly\
|
||||
Γίνεται μεταγλώττιση του προγράμματος σε γλώσσα Assembly και αποθηκεύεται στον δίσκο με το επίθεμα .a
|
||||
- RunLibrary\
|
||||
Γίνεται μεταγλώττιση του προγράμματος σε γλώσσα Assembly και αποθηκεύεται στον δίσκο με το επίθεμα .a για να χρησιμοποιηθεί για την δημιουργία βιβλιοθηκών
|
||||
ρουτινών.
|
||||
- DebugToggleBreakpoint\
|
||||
Τοποθετείται/ακυρώνεται στην τρέχουσα γραμμή σημείο διακοπής εκτέλεσης (Breakpoint) για έλεγχο της ροής και τνω μεταβλητών του προγράμματος.
|
||||
- DebugClearBreakpoints\
|
||||
Ακυρώνονται τα σημεία διακοπής (Breakpoints) σε όλο το πρόγραμμα.
|
||||
- DebugEraseBreakpoints\
|
||||
Ακυρώνονται τα σημεία διακοπής (Breakpoints) στην τρέχουσα ρουτίνα.
|
||||
- DebugMemory\
|
||||
Εμφανίζονται τα περιεχόμενα της μνήμης σε σημεία πού επιλέγετε.
|
||||
- DebugAssembly\
|
||||
Εμφανίζεται η τρέχουσα γραμμή σε μορφή Assembly και μπορούμε να προχωράμε τις εντολές βήμα-βήμα.
|
||||
- DebugRegisters\
|
||||
Εμφανίζονται τα περιεχόμενα των καταχωρητών (Registers) του επεξεργαστή.
|
||||
- Help\
|
||||
Βοήθεια για την λειτουργία το περιβάλλοντος προγραμματισμού.
|
||||
|
||||
|
||||
### [2. Παράθυρο εμφάνισης αποτελεσμάτων]{#s2}
|
||||
|
||||

|
||||
|
||||
Σε αυτό το πραράθυρο εμφανίζονται τα μυνήματα εισόδου/εξόδου όταν η εφαρμογή μας δεν είναι κατασκευασμένη για γραφικό περιβάλλον. Εμφανίζονται τα αποτελέσματα
|
||||
(output) ή οι ερωτήσεις για πληκτρολόγηση δεδεομένων (input) με το απλό στύλ της κονσόλας.\
|
||||
Για απλά προγράμματα χωρίς περίπλοκη εισαγωγή δεδομένων είναι ότι πρέπει γιατί δεν υπάρχει λόγος να μπλέξουμε με γραφικό περιβάλλον στις απλές εφαρμογές.
|
||||
|
||||
|
||||
### [3. Παράθυρο κατασκευής γραφικών αντικειμένων]{#s3}
|
||||
|
||||

|
||||
|
||||
Με την βοήθεια του toolkit μπορούμε να δημιουργήσουμε παράθυρα,κουμπιά και ότι άλλο προσφέρει το GuiDesigner για να κατασκευάσουμε το περιβάλλον της εφαρμογής
|
||||
μας. Για να φανούν οι δυνατότητες του, θα αναφέρω παρακάτω ένα-ένα τα εικονίδια και τι κάνει το κάθε ένα. Πρώτα από όλα να δούμε τι κάνουν τα μενού.
|
||||
|
||||

|
||||
|
||||
Επιλέγοντας το Window μπορούμε να δημιουργήσουμε νέο παράθυρο, να εξαφανίσουμε το τρέχον, να ανακαλέσουμε κάποιο παλαιό για διόρθωση/συμπλήρωμα, να
|
||||
αποθηκεύσουμε αυτό που έχουμε δημιουργήσει ή και να διαγράψουμε μόνιμα το τρέχον παράθυρο. Προσοχή! Δεν υπάρχει τρόπος να ανακληθεί παράθυρο που έχει διαγραφεί.
|
||||
Ο τρόπος αποθήκευσης είναι τέτοιος ώστε τα παράθυρα αποθηκεύνται με ειδικές παραμέτρους για να μπορούν να ενσωματωθούν και να επικοινωνούν με την εφαρμογή μας.
|
||||
Η τρίτη και δεύτερη επιλογή από το τέλος κάνει αυτή την μετατροπή στην μνήμη για να είναι άμεσα διαθέσιμες οι εντολές στο πρόγραμμά μας. Η τελευταία επιλογή
|
||||
είναι φανερό ότι είναι το τέλος λειτουργίας του GuiDesigner.
|
||||
|
||||

|
||||
|
||||
Επιλέγοντας το Grid μπορούμε να ρυθμίσουμε την εμφάνιση, την συμεριφορά, την σειρά και την εξάρτηση (ποιό αντικείμενο ανήκει που, ομάδες κλπ) του κάθε
|
||||
αντικειμένου. Η τελευταία επιλογή είναι για την διαγραφή του τρέχοντος αντικειμένου.\
|
||||
Παρακάτω θα δούμε ένα ένα τα αντικείμενα του γραφικού περιβάλλοντος ένα ένα.
|
||||
|
||||
----------------------------------------------------- ----------------------------------------------------- -----------------------------------------------------
|
||||
\ XuiColor. Επιλογή χρωμάτων (125 διαθέσιμα)
|
||||

|
||||
|
||||
 XuiLabel. Εμφάνιση γραμμών κειμένου ή εικόνας
|
||||
|
||||
 XuiCheckBox Επιλογή ανεξαρτήτων επιλογών (όχι μία από ομάδα)..
|
||||
|
||||
 XuiRadioBox Επιλογή από μια ομάδα XuiRadioBox.
|
||||
|
||||
 XuiPressButton Επιλέγεται όταν πατήσουμε το ποντίκι.
|
||||
|
||||
 XuiPushButton Επιλέγεται όταν πατήσουμε και αφήσουμε το ποντίκι.
|
||||
|
||||
 XuiToggleButton Με το πρώτο πάτημα ένεργοποιείται και με το δεύτερο
|
||||
απενεργοποιείται.
|
||||
|
||||
 XuiScrollBarH Οριζόντια κίνηση/τοποθέτηση.
|
||||
|
||||
 XuiScrollBarV Κάθετη κίνηση/τοποθέτηση.
|
||||
|
||||
 XuiTextLine Εισαγωγή κειμένου (μία γραμμή).
|
||||
|
||||
 XuiTextArea Εισαγωγή κειμένου (πολλές γραμμές).
|
||||
|
||||
 XuiMenu Δημιουργία μενού εντολών.
|
||||
|
||||
 XuiMenuBar Μενού επιλογών σε οριζόντια διάταξη.
|
||||
|
||||
 XuiPullDown Μενού επιλογών σε κάθετη διάταξη.
|
||||
|
||||
 XuiList Επιλογή ενός στοιχείου διαθέσιμου από μια λίστα.
|
||||
|
||||
  XuiMessage1B/2B/3B/4B Εμφάνιση μηνύματος με 1/2/3/4 κουμπιά επιλογών
|
||||
  αντίστοιχα.
|
||||
|
||||
 XuiProgress Εμφάνιση ποσοστού εκτέλεσης/υπολοίπου για κάποια
|
||||
διαδικασία.
|
||||
|
||||
  XuiDialog2B/3B/4B Εμφάνιση μηνύματος και αποδοχή απάντησης από τον
|
||||
 χρήστη με 2/3/4 κουμπιά επιλογών.
|
||||
|
||||
 XuiDropButton Εμφάνιση λίστας επιλογών με πάτημα κουμπιού.
|
||||
|
||||
 XuiDropBox Καταχώρηση κειμένου ή επιλογή από λίστα επιλογών
|
||||
|
||||
 XuiListButton Εμφάνιση λίστας επιλογών με πάτημα κουμπιού με μπάρα
|
||||
μετακίνησης στην λίστα.
|
||||
|
||||
 XuiListBox Καταχώρηση κειμένου ή επιλογή από λίστα επιλογών με
|
||||
μπάρα μετακίνησης στην λίστα .
|
||||
|
||||
 XuiRange Εμφάνιση τιμής και μεταβολή της +- με το πάτημα
|
||||
κουμπιών.
|
||||
|
||||
 XuiFile Ετοιμο παράθυρο για την επιλογή αρχείου
|
||||
|
||||
 XuiFont Ετοιμο παράθυρο επιλογής χαρακτήρων. (Είδος, μέγεθος,
|
||||
έντονα κλπ.)
|
||||
|
||||
 XuiListDialog2B Εμφάνιση μηνύματος και αποδοχή απάντησης από τον
|
||||
χρήστη με 2 κουμπιά
|
||||
|
||||
|
||||
----------------------------------------------------- ----------------------------------------------------- -----------------------------------------------------
|
||||
|
||||
Αυτά είναι τα διάφορα αντικείμενα που μπορούμε να χρησιμοποιήσουμε για να κατασκευάσουμε την παραθυρική εφαρμογή μας.
|
||||
|
||||
|
||||
### [4. Επίλογος]{#s4}
|
||||
|
||||
Μετά την πρώτη γνωριμία με το περιβάλλον στο επόμενο άρθρο θα δούμε τα βασικά δομικά στοιχεία που αποτελούν μια εφαρμογή XBASIC είτε σε περιβάλλον κονσόλας είτε
|
||||
σε παραθυρικό περιβάλλον (φόρμες, κουμπιά, πεδία κλπ.) Θα γίνουν και κάποια συγκριτικά τεστ με τις άλλες δύο Basic που ξέρω (Basic για το DOS και Visual Basic
|
||||
gia ta Windows) έτσι για να δούμε και τί γίνεται από ταχύτητες και θα αναφέρω ότι άλλο δώ ότι είναι ενδιαφέρον κάποιος να ξέρει πρίν ξενικήσει να γράψει την
|
||||
πρώτη του εφαρμογή. Θα τα ξαναπούμε στο επόμενο Magaz.
|
||||
|
505
content/articles/24/03_gawk.md
Κανονικό αρχείο
505
content/articles/24/03_gawk.md
Κανονικό αρχείο
|
@ -0,0 +1,505 @@
|
|||
+++
|
||||
title = 'Προγραμματισμός με gawk μέρος 2ο'
|
||||
date = '2000-04-01T00:00:00Z'
|
||||
description = ''
|
||||
author = 'DJ Art(mailto:djart@hellug.gr)'
|
||||
issue = ['Magaz 24']
|
||||
issue_weight = 3
|
||||
+++
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
*Το άρθρο αυτό αποτελεί το δεύτερο (και τελευταίο) μέρος της παρουσίασης της γλώσσας awk με στόχο την βοήθεια για την εκμάθησή της.*
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
**1. Ενσωματωμένες συναρτήσεις**
|
||||
-------------------------------------------------------
|
||||
|
||||
**2. Αριθμητικοί τελεστές**
|
||||
--------------------------------------------------
|
||||
|
||||
**3. Εντολές ελέγχου ροής**
|
||||
--------------------------------------------------
|
||||
|
||||
- [3.1 If](#ss3.1)
|
||||
- [3.2 Υποθετικός τελεστής](#ss3.2)
|
||||
- [3.3 βρόγχοι](#ss3.3)
|
||||
|
||||
**4. Advanced Input**
|
||||
--------------------------------------------
|
||||
|
||||
- [4.1 Next](#ss4.1)
|
||||
- [4.2 Exit](#ss4.2)
|
||||
- [4.3 Getline](#ss4.3)
|
||||
- [4.4 Input από αρχείο](#ss4.4)
|
||||
- [4.5 Input από εντολή](#ss4.5)
|
||||
- [4.6 Τερματίζοντας το Input από αρχείο ή εντολή](#ss4.6)
|
||||
|
||||
**5. Advanced Output**
|
||||
---------------------------------------------
|
||||
|
||||
- [5.1 Printf](#ss5.1)
|
||||
- [5.2 Output σε αρχείο](#ss5.2)
|
||||
- [5.3 Output σε εντολή](#ss5.3)
|
||||
- [5.4 Τερματίζοντας το Output από αρχείο ή εντολή](#ss5.4)
|
||||
|
||||
**6. Συναρτήσεις**
|
||||
-----------------------------------------
|
||||
|
||||
- [6.1 Δήλωση της συνάρτησης](#ss6.1)
|
||||
- [6.2 Συνάρτηση με παραμέτρους](#ss6.2)
|
||||
- [6.3 Η δήλωση return](#ss6.3)
|
||||
- [6.4 Η συνάρτηση system](#ss6.4)
|
||||
|
||||
**7. Βιβλιογραφία**
|
||||
------------------------------------------
|
||||
|
||||
|
||||
### [1. Ενσωματωμένες συναρτήσεις]{#s1}
|
||||
|
||||
Παρακάτω, μπορείτε να δείτε έναν πίνακα με χρήσιμες συναρτήσεις που μπορείτε να χρησιμοποιήσετε σε ένα πρόγραμμά σας:
|
||||
|
||||
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
|
||||
\ Επιστρέφει το ημίτονο του x
|
||||
sin(x)
|
||||
|
||||
cos(x) Επιστρέφει το συνημίτονο του x
|
||||
|
||||
int(x) Επιστρέφει το ακέραιο μέρος του x
|
||||
|
||||
log(x) Επιστρέφει το φυσικό λογάριθμο του x
|
||||
|
||||
exp(x) Eπιστρέφει το e υψωμένο στη δύναμη του x
|
||||
|
||||
sqrt(x) Επιστρέφει την τετραγωνική ρίζα του x
|
||||
|
||||
getline() Διαβάζει την επόμενη γραμμή από το αρχείο.\
|
||||
Επιστρέφει 0 για το τέλος του αρχείου, διαφορετικά,\
|
||||
επιστρέφει 1
|
||||
|
||||
rand() Επιστρέφει έναν τυχαίο αριθμό ανάμεσα στο 0 και στο 1.
|
||||
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
|
||||
|
||||
|
||||
### [2. Αριθμητικοί τελεστές]{#s2}
|
||||
|
||||
Εδώ, επίσης θα δείτε έναν πίνακα, ο οποίος παρουσιάζει τους τελεστές που μπορείτε να χρησιμοποιήσετε για να κάνετε αριθμητικές πράξεις:
|
||||
|
||||
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
|
||||
\ Υψώνει το x στη δύναμη του y
|
||||
x\^y
|
||||
|
||||
x\*\*y Κάνε ακριβώς την ίδια δουλειά με τον παραπάνω τελεστή
|
||||
|
||||
x%y Υπολογίζει το υπόλοιπο της διαίρεσης x/y
|
||||
|
||||
x+y Προσθέτει το x στο y
|
||||
|
||||
x-y Αφαιρεί το y από το x
|
||||
|
||||
x\*y Πολλαπλασιάζει το x με το y
|
||||
|
||||
x/y Διαιρεί το x με το y
|
||||
|
||||
-x Επιστρέφει τον αντίθετο του x (αλλάζει το πρόσημο)
|
||||
|
||||
++x Αυξάνει τον x κατά 1 και χρησιμοποιεί την τιμή (όλου αυτού)
|
||||
|
||||
x++ Χρησιμοποιεί πρώτα την τιμή του x και μετά την αυξάνει κατά 1
|
||||
|
||||
\--x (αντίστοιχα με τα παραπάνω)
|
||||
|
||||
x\-- (αντίστοιχα με τα παραπάνω
|
||||
|
||||
x=y Αποδίδει την τιμή του y στον x
|
||||
|
||||
x+=y Ισοδυναμεί με την παράσταση x=x+y
|
||||
|
||||
x/=y Iσοδυναμεί με την παράσταση x=x/y
|
||||
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
|
||||
|
||||
**Παραδείγματα**\
|
||||
Ακόμα μπερδευόσαστε με τα x++ και ++x ; :-) Πάμε, λοιπόν, να δούμε μέσα από παραδείγματα τί ακριβώς προσφέρουν:
|
||||
|
||||
x++\
|
||||
Αυτή εδώ η παράσταση ισοδυναμεί με την παράσταση x=x+1. Λοιπόν, προσέξτε: όσοι ασχολούνται για πρώτη φορά με τον προγραμματισμό, πρέπει να δώσουν ιδιαίτερη
|
||||
προσοχή με το σύμβολο της ισότητας. Εδώ το = δεν σημαίνει ακριβώς \"ίσον\" !!! Το σύμβολο = χρησιμοποιείται για να αποδώσει τιμές. Δηλαδή, στην ισότητα x=x+1,
|
||||
δεν πρέπει κανείς να πάει και \"να φέρει το x στο πρώτο μέλος, οπότε να μείνει 0=1\" !!! Απλά, το = κάνει το εξής: αποδίδει στην μεταβλητή x την τιμή που
|
||||
υπάρχει στο δεξί μέρος του, δηλαδή, αν αρχικά είχαμε ορίσει ότι το x είναι ίσο με 3, τώρα, μετά από αυτήν την δήλωση, το x θα είναι ίσο με 4.
|
||||
|
||||
y = x++\
|
||||
Αυτή εδώ η παράσταση, αντιστοιχεί σε δύο παραστάσεις, στην y=x και στην x=x+1. Δηλαδή, αν αρχικά το x είναι ίσο με 3, τότε το y ισούται με 3 (**ΠΡΟΣΟΧΗ εδώ**),
|
||||
ενώ το x πιά ισούται με 4 !!!! Κοιτάξτε και το παρακάτω παράδειγμα για να καταλάβετε:
|
||||
|
||||
y = \--x\
|
||||
Λοιπόν, και αυτή η παράσταση αντιστοιχεί σε άλλες δύο, στην x=x-1 και στην y=x. Μα, θα μου πείτε, αυτές οι δύο δεν έχουν διαφορά με τις παραπάνω. Πρέπει να
|
||||
λάβετε υπ\' όψιν την σειρά με την οποία εκτελούνται οι παραστάσεις, δηλαδή εδω, **ΠΡΩΤΑ** μειώνεται η τιμή του x κατά 1 και **ΜΕΤΑ** αποδίδεται η τιμή (του
|
||||
μειωμένου πιά x) στην μεταβλητή y, δηλαδή αν είχαμε αρχικά ότι το x ισούται με 3, τότε τώρα πιά, το x **ΑΛΛΑ ΚΑΙ ΤΟ** y ισούται με 2.
|
||||
|
||||
|
||||
### [3. Εντολές ελέγχου ροής]{#s3}
|
||||
|
||||
### [3.1 If]{#ss3.1}
|
||||
|
||||
Απο τη φύση της, η 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 Υποθετικός τελεστής]{#ss3.2}
|
||||
|
||||
Η gawk σας παρέχει με αυτόν τον τελεστή, ο οποίος αποτελείται από τρείς παραμέτρους, τη δυνατότητα να εφαρμόζετε if-ελέγχους ανά πάσα στιγμή μέσα στο πρόγραμμά
|
||||
σας. Η μορφή του είναι η εξής:
|
||||
|
||||
υπόθεση ? αποτέλεσμα σε περίπτωση αλήθειας : εναλλακτικό αποτέλεσμα (σε μη-αληθινή περίπτωση)
|
||||
|
||||
Αυτός ο τελεστής καθιστά τα προγράμματά σας πιο ευανάγνωστα. Ας δούμε ένα παράδειγμα χρήσης του παραπάνω τελεστή σε περίπτωση όπου ανάλογα με τον αριθμό των
|
||||
αρχείων που αντιγράφηκαν, θέλουμε πληθυντικό ή ενικό:
|
||||
|
||||
{ print $1, "αρχεί" $1 != 1 ? "α αντιγράφηκαν" : "ο αντιγράφηκε" }
|
||||
|
||||
Αν θα θέλαμε να γράψουμε το παραπάνω, χρησιμοποιώντας το if, τότε θα γράφαμε:
|
||||
|
||||
if ( $1 != 1 )
|
||||
print $1, "αρχεία αντιγράφηκαν"
|
||||
else
|
||||
print $1, "αρχείο αντιγράφηκε"
|
||||
|
||||
### [3.3 βρόγχοι]{#ss3.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 είναι ιδιαίτερα χρήσιμη αν θέλετε (για κάποιο λόγο, για κάποια συνθήκη) να \"παρακάμψετε\" κάποιες εντολές του κώδικα.
|
||||
|
||||
|
||||
### [4. Advanced Input]{#s4}
|
||||
|
||||
Εξ ορισμού, η awk αυτόματα διαβάζει και εκτελεί συνέχεια την ίδια δουλειά: Διαβάζει μιά εγγραφή και αν ταιριάξει κάποιο πεδίο ή εγγραφή με το πρότυπο, τότε
|
||||
εκτελεί την πράξη. Όμως, η awk σας δίνει την δυνατότητα να \"επέμβετε\" σε όλην αυτήν την διαδικασία και να πάρετε την είσοδο (input) από ένα άλλο αρχείο ή να
|
||||
προκαλέσετε πρώιμο ξαναξεκίνημα της όλης διαδικασίας, να πάρετε είσοδο από την έξοδο κάποιας εντολής κλπ.
|
||||
|
||||
### [4.1 Next]{#ss4.1}
|
||||
|
||||
Η εντολή next \"υποχρεώνει\" την awk να διαβάσει την αμέσως επόμενη εγγραφή και να κάνει τα γνωστά (ταίριασμα των προτύπων και αν είναι αληθές, τότε εκτέλεση
|
||||
της πράξης κλπ.), δηλαδή αγνοείται πλήρως η παρούσα εγγραφή που επεξεργάζεται η awk.
|
||||
|
||||
### [4.2 Exit]{#ss4.2}
|
||||
|
||||
Η εντολή exit, χρησιμοποιούμενη σε πράξη, συμπεριφέρεται σαν να έφτασε το τέλος του αρχείου (που επεξεργάζεται η awk). Αυτό έχει σαν συνέπεια να σταματήσει,
|
||||
γενικότερα, η εκτέλεση του κώδικα, δεν εκτελούνται άλλες πράξεις, δεν ταιριάζονται άλλα πρότυπα. Στη συνέχεια, κανονικά, εκτελείται (αν υπάρχει, βέβαια) το
|
||||
ειδικό πρότυπο END.
|
||||
|
||||
Αν τώρα, χρησιμοποιήσουμε την εντολή exit μέσα στο ειδικό πρότυπο END, τότε τερματίζεται ολόκληρο το πρόγραμμα, δεν εκτελείται τίποτα άλλο στη συνέχεια.
|
||||
|
||||
### [4.3 Getline]{#ss4.3}
|
||||
|
||||
Η εντολή getline διαβάζει μία εγγραφή \"κατηγορηματικά\", επιστρέφει 1 αν η ανάγνωση της εγγραφής ήταν επιτυχής (θυμίζω πως εξ ορισμού η κάθε γραμμή ενός
|
||||
αρχείου αποτελεί μία εγγραφή), ή 0 αν δεν ήταν επιτυχής (δηλαδή αν έφτασε στο τέλος του αρχείου). Η getline συμπεριφέρεται \"κανονικά\", δηλαδή ορίζει με τον
|
||||
σωστό τρόπο το \$0, ορίζει τις μεταβλητές πεδίων και τις μεταβλητές FNR, NR και NF).
|
||||
|
||||
### [4.4 Input από αρχείο]{#ss4.4}
|
||||
|
||||
Έτσι, λοιπόν, η getline μπορεί να χρησιμεύσει για να πάρετε είσοδο δεδομένων από κάποιο αρχείο, το οποίο δεν αναφέρατε στην γραμμή εντολών. Η γενική μορφή, με
|
||||
την οποία χρησιμοποιούμε την getline σ\' αυτήν την περίπτωση είναι η getline \< \"filename\". Σε αυτήν την περίπτωση, αν το αρχείο υπάρχει και η getline διάβασε
|
||||
εγγραφή, επιστρέφει 1, αλλιώς αν έφτασε στο τέλος του αρχείου επιστρέφει 0, ενώ αν το αρχείο δεν υπάρχει επιστρέφει -1.
|
||||
|
||||
ΣΗΜΕΙΩΣΗ: Και πάλι, οι μεταβλητές \$0, οι μεταβλητές πεδίων και η NF ορίζονται κανονικά, ενώ οι μεταβλητές FNR και NR **ΔΕΝ ΑΛΛΑΖΟΥΝ, ΠΑΡΑΜΕΝΟΥΝ ΩΣ ΕΙΧΑΝ !!**
|
||||
|
||||
### [4.5 Input από εντολή]{#ss4.5}
|
||||
|
||||
Μιά άλλη περίπτωση όπου χρησιμοποιείται η getline, είναι η είσοδος από UNIX εντολή. Ας δούμε πως μπορούμε να συντάξουμε κάτι τέτοιο:
|
||||
|
||||
while ("UNIX εντολή" | getline)
|
||||
{
|
||||
# ακολουθούν οι εντολές που θέλω να εκτελέσω
|
||||
}
|
||||
|
||||
Φανταστείτε π.χ. πως θα θέλατε κάθε φορά που μπαίνει ένας χρήστης στο σύστημα, να τυπώνετε ένα μήνυμα (ή, τέλος πάντων, να κάνατε κάτι άλλο), τότε στη θέση της
|
||||
UNIX εντολής θα βάζατε το who ή και το who -u.
|
||||
|
||||
### [4.6 Τερματίζοντας το Input από αρχείο ή εντολή]{#ss4.6}
|
||||
|
||||
Καλό θα είναι, κάθε φορά που χρησιμοποιείτε την getline για να \"ανοίξετε\" ένα αρχείο ή μία εντολή, δηλαδή να πάρετε είσοδο από αυτά, να τα \"κλείνετε\" όταν
|
||||
τελειώσετε με αυτά. Υπάρχει ένας μέγιστος αριθμός \"ανοιχτών\" αρχείων/εντολών που επιτρέπεται σε έναν χρήστη (αυτός ο αριθμός ποικίλει από σύστημα σε σύστημα,
|
||||
αλλά και ανάλογα με τις ρυθμίσεις του διαχειριστή του συστήματος). Με το να \"κλείνετε\" τις εντολές/αρχεία που χρησιμοποιήσατε, ουσιαστικά μειώνετε την
|
||||
πιθανότητα να φτάσετε τον μέγιστο αριθμό. Λοιπόν, αυτό μπορείτε να το κάνετε με την εξής εντολή:
|
||||
|
||||
close ("filename")
|
||||
|
||||
Στη θέση του filename μπορείτε να χρησιμοποιήσετε είτε το όνομα κάποιας μεταβλητής (η οποία περιέχει αρχείο/εντολή) είτε το όνομα της εντολής που
|
||||
χρησιμοποιήσατε (εδώ, προσέξτε να δηλώσετε την ακριβή εντολή που χρησιμοποιήσατε, π.χ. αν χρησιμοποιήσετε την who -u να γράψετε close (\"who -u\") \...).
|
||||
|
||||
|
||||
### [5. Advanced Output]{#s5}
|
||||
|
||||
Μερικές πιο ειδικευμένες δυνατότητες υπάρχουν στην awk για την έξοδο (output). Αυτές είναι: το \"όμορφο\" φορμάρισμα του κειμένου, η ανακατεύθυνση του output σε
|
||||
αρχεία (κειμένου) και η διασωλήνωση του output στην είσοδο (input) άλλων (εξωτερικών) εντολών του command prompt.
|
||||
|
||||
### [5.1 Printf]{#ss5.1}
|
||||
|
||||
Η εντολή print που είδαμε (στο 1ο μέρος), είναι αρκετά απλή και το output της είναι και αυτό αρκετά απλό. Αν, όμως, θέλετε να έχετε μορφοποιημένη την έξοδο του
|
||||
προγράμματός σας (παραγωγή στηλών, για παράδειγμα), τότε θα πρέπει να χρησιμοποιήσετε την δανεισμένη από τη C εντολή, την printf. H printf έχει την εξής γενική
|
||||
μορφή:
|
||||
|
||||
printf("αλφαριθμητικό ελέγχου", λίστα_ορισμάτων, 1ο όρισμα, 2ο όρισμα, κ.ο.κ.)
|
||||
|
||||
Το αλφαριθμητικό ελέγχου, μπορεί να αποτελείται από τα εξής στοιχεία:
|
||||
|
||||
1. Απλούς χαρακτήρες (δηλαδή κείμενο)
|
||||
2. ειδικούς μεταχαρακτήρες (θυμάστε το \\n π.χ.)
|
||||
3. Τις διαταγές φόρμας
|
||||
|
||||
Ας δούμε από ένα παράδειγμα για τα παραπάνω τρία στοιχεία, και μετά να μιλήσουμε περισσότερο για τις διαταγές φόρμας:
|
||||
|
||||
1. printf(\"hello world\")
|
||||
2. printf(\"\\f\")
|
||||
3. printf(\"%22s\", \"Magaz\")
|
||||
4. Και φυσικά, συνδυασμό όλων αυτών των στοιχείων (θα το δούμε)
|
||||
|
||||
#### Διαταγές φόρμας
|
||||
|
||||
Λοιπόν, κάθε διαταγή φόρμας αποτελείται από 3 μέρη. Στο 1ο μέρος, **ΠΑΝΤΑ**, γράφουμε το σύμβολο του ποσοστού (**%**). Κάθε διαταγή φόρμας αρχίζει με αυτό το
|
||||
σύμβολο. Το 2ο μέρος συμπληρώνεται προαιρετικά. Συμπληρώνεται με αριθμούς, οι οποίοι υποδηλώνουν το μέγιστο μήκος της εξόδου. Τέλος, το 3ο μέρος αποτελείται από
|
||||
ειδικούς χαρακτήρες, οι οποίοι υποδηλώνουν το είδος της εξόδου (αν είναι αλφαριθμητικό, αν είναι δεκαδικός αριθμός κλπ.) Θα μιλήσουμε τώρα αναλυτικότερα για το
|
||||
2ο μέρος και μετά θα δούμε έναν πίνακα με τους χαρακτήρες του 3ου μέρους.
|
||||
|
||||
Ο αριθμός, το εύρος πεδίου, αποτελείται από δύο αριθμούς οι οποίοι χωρίζονται με μία τελεία (.), δηλαδή είναι της μορφής x.y. Αν η έξοδος μας είναι δεκαδικός
|
||||
αριθμός, τότε ο αριθμός αριστερά από την τελεία υποδηλώνει τον αριθμό ψηφίων **ΟΛΟΥ** του αριθμού (*συμπεριλαμβανόμενης της τελείας (.) του αριθμού*), ενώ ο
|
||||
αριθμός δεξιά από την τελεία υποδηλώνει τον αριθμό ψηφίων του δεκαδικού μέρους του αριθμού. Αν τώρα, η έξοδος μας δεν είναι δεκαδικός αριθμός, αλλά ο,τιδήποτε
|
||||
άλλο, τότε ο αριθμός αριστερά από την τελεία είναι ο ελάχιστος αριθμός ψηφίων/χαρακτήρων αυτού που θα τυπώσουμε, ενώ ο αριθμός δεξιά της τελείας είναι ο
|
||||
μέγιστος αριθμός ψηφίων/χαρακτήρων και ο \"πραγματικός\" αριθμός των ψηφίων/χαρακτήρων που τελικά θα εκτυπωθούν. Δηλαδή, μπορείτε κάλλιστα να παραλείψετε τον
|
||||
αριθμό αριστερά της τελείας (π.χ. %.4s)
|
||||
|
||||
**ΣΗΜΕΙΩΣΕΙΣ:**\
|
||||
Αν θέλετε μέσα από την printf να τυπώσετε τον χαρακτήρα %, τότε θα γράψετε μέσα στον κώδικά σας %%.\
|
||||
Εξ ορισμού, η έξοδος της printf είναι σε δεξιά στοίχιση. Αν θέλετε να έχετε αριστερή, τότε μπροστά από τον αριθμό που βρίσκεται αριστερά της τελείας (στο εύρος
|
||||
πεδίου) βάζετε το σύμβολο μείον (-).
|
||||
|
||||
Παρακάτω, βλέπετε τον πίνακα με τους χαρακτήρες που μπορείτε να χρησιμοποιήσετε. Στη συνέχεια θα δούμε και παραδείγματα.
|
||||
|
||||
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
|
||||
\ **Σημασία**
|
||||
**Κωδικός φόρμας**
|
||||
|
||||
%c Χαρακτήρας ASCII
|
||||
|
||||
%d Ακέραιος δεκαδικός αριθμός
|
||||
|
||||
%i Το ίδιο με το %d
|
||||
|
||||
%e Εκτύπωση δεκαδικού αριθμού κινητής υποδιαστολής με επιστημονική\
|
||||
σημειογραφία, δηλαδή της μορφής \[-\]x.xxxxe\[-/+\]xxx
|
||||
|
||||
%f Δεκαδικός κινητής υποδιαστολής
|
||||
|
||||
%g Η awk κρίνει και διαλέγει για έναν αριθμό μία από τις μορφές %e και\
|
||||
%f (όποια έχει μικρότερο μήκος) και, παράλληλα, \"απαλοίφει\" άχρηστα μηδενικά
|
||||
|
||||
%o Μη προσημασμένος (χωρίς πρόσημο) ακέραιος οκταδικός αριθμός
|
||||
|
||||
%s Αλφαριθμητικό
|
||||
|
||||
%x Μη προσημασμένος ακέραιος δεκαεξαδικός αριθμός (με πεζά τα abcdef)
|
||||
|
||||
%X Μη προσημασμένος ακέραιος δεκαεξαδικός αριθμός (με κεφαλαία τα ABCDEF)
|
||||
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
|
||||
|
||||
#### Παραδείγματα
|
||||
|
||||
Επειδή θέλω να σας δείξω την λειτουργία του εύρους πεδίου, θα συμβολίζω τα κενά με παύλα (-), ώστε να μπορείτε να μετρήσετε τους χαρακτήρες και τα κενά (και να
|
||||
βγάλετε τα συμπεράσματά σας):
|
||||
|
||||
printf("%10d\n", 29) (θα έχει σαν αποτέλεσμα:) --------29
|
||||
|
||||
printf("%-10d\n", 29) 29--------
|
||||
|
||||
printf("%10.3f\n", 123.56) ---123.560
|
||||
|
||||
printf("%15s\n", "Linux Magaz") ----Linux Magaz
|
||||
|
||||
printf("%-15s\n", "Linux Magaz") Linux Magaz----
|
||||
|
||||
### [5.2 Output σε αρχείο]{#ss5.2}
|
||||
|
||||
Όπως και στην περίπτωση της getline, έτσι και εδώ, μπορείτε να χρησιμοποιήσετε τα σύμβολα της ανακατεύθυνσης για να στείλετε την έξοδο κατ\' ευθείαν μέσα σε ένα
|
||||
αρχείο. Π.χ:
|
||||
|
||||
printf("hello world\n") > "filename"
|
||||
printf("hello world\n") >> "filename"
|
||||
|
||||
### [5.3 Output σε εντολή]{#ss5.3}
|
||||
|
||||
Σε αυτήν την περίπτωση, έχετε την δυνατότητα να στείλετε έξοδο (output) στην είσοδο (input) μιάς εξωτερικής εντολής του UNIX. Π.χ:
|
||||
|
||||
printf("hello world\n") | "sort -t , "
|
||||
|
||||
### [5.4 Τερματίζοντας το Output από αρχείο ή εντολή]{#ss5.4}
|
||||
|
||||
Ακριβώς για τους ίδιους λόγους που αναφέραμε στην getline, έτσι και εδώ, καλό θα ήταν να \"κλείνετε\" ένα αρχείο ή μία εντολή αφού τελειώσετε με αυτά. Η σύνταξη
|
||||
είναι ακριβώς η ίδια: close (\"filename\") και στη θέση του filename χρησιμοποιείτε είτε όνομα αρχείου, είτε το όνομα της **ΑΚΡΙΒΟΥΣ** εντολής που τρέξατε με
|
||||
διασωλήνωση, είτε το όνομα κάποιας μεταβλητής που \"δείχνει\" σε αρχείο.
|
||||
|
||||
|
||||
### [6. Συναρτήσεις]{#s6}
|
||||
|
||||
**ΠΡΟΣΟΧΗ!!!**\
|
||||
Οι συναρτήσεις (που ορίζονται από τον χρήστη) δεν υπάρχουν στην \"αυθεντική\" awk, αλλά προστέθηκαν αργότερα στην nawk και υποστηρίζονται από την gawk.
|
||||
|
||||
Όπως θα καταλάβατε, εκτός από τις ενσωματωμένες συναρτήσεις η gawk σας επιτρέπει να φτιάξετε τις δικές σας. Μία συνάρτηση χρησιμεύει σε ένα πρόγραμμα αν θέλετε
|
||||
να επαναλάβετε τα ίδια κομμάτια κώδικα σε πολλά σημεία του προγράμματος, ώστε να μην ξαναγράφετε κάθε φορά το ίδιο πράγμα. Η χρήση των συναρτήσεων απαιτεί δύο
|
||||
βήματα: την δήλωση της συνάρτησης και την κλήση της συνάρτησης μέσα στο πρόγραμμα.
|
||||
|
||||
### [6.1 Δήλωση της συνάρτησης]{#ss6.1}
|
||||
|
||||
Παρακάτω, θα δούμε τον κώδικα που απαιτείται για να δηλώσετε μιά συνάρτηση. Επιπλέον, να σημειώσω πως δεν παίζει κανέναν ρόλο η θέση που θα δηλώσετε την
|
||||
συνάρτηση. Μπορείτε κάλλιστα να την δηλώσετε στο τέλος του προγράμματος.
|
||||
|
||||
function όνομα_συνάρτησης(παράμετροι) {
|
||||
κώδικας της συνάρτησης
|
||||
}
|
||||
|
||||
Τώρα θα δούμε τη λειτουργία των συναρτήσεων μέσα από τρία παραδείγματα. Το πρώτο παράδειγμα θα δείχνει την συνάρτηση στην απλή της μορφή (χωρίς παραμέτρους), το
|
||||
δεύτερο παράδειγμα θα δείχνει τη χρήση, λειτουργία και χρησιμότητα των παραμέτρων, ενώ στο 3ο παράδειγμα, θα μιλήσουμε για την δήλωση return και θα δούμε το
|
||||
αντίστοιχο παράδειγμα.
|
||||
|
||||
BEGIN { function1() }
|
||||
|
||||
function function1() {
|
||||
printf("Magaz τεύχος 24\n");
|
||||
printf("Άρθρο για gawk\n");
|
||||
}
|
||||
|
||||
Όταν τρέξουμε το πρόγραμμα, το αποτέλεσμα θα είναι να μας τυπώσει στην οθόνη το περιεχόμενο των δύο printf, όπως ορίζονται μέσα στην συνάρτηση. Δώστε ιδιαίτερη
|
||||
έμφαση στις παρενθέσεις της συνάρτησης, πάντα πρέπει να τις γράφετε (σε αντίθεση με τις ενσωματωμένες συναρτήσεις της awk, όπου είναι προαιρετική η αναγραφή των
|
||||
παρενθέσεων).
|
||||
|
||||
### [6.2 Συνάρτηση με παραμέτρους]{#ss6.2}
|
||||
|
||||
Όταν χρησιμοποιούμε παραμέτρους στη συνάρτηση, τότε η αριθμητική αξία της μεταβλητής που αποτελεί την παράμετρο, αντιγράφεται και μετά \"περνάει\" στην
|
||||
συνάρτηση. Αυτό έχει σαν αποτέλεσμα η αρχική τιμή της μεταβλητής-παραμέτρου να παραμένει αναλλοίωτη. Αυτό είναι ένα πλεονέκτημα, μπορεί να μας φανεί σε πολλές
|
||||
περιπτώσεις χρήσιμο. Βέβαια, υπάρχει πάντα και η δυνατότητα να αλλοιωθεί, θα το δούμε παρακάτω. Ας δούμε τώρα ένα παράδειγμα:
|
||||
|
||||
BEGIN { variable = 0; function1(variable);
|
||||
printf("Η τιμή της μεταβλητής variable είναι: %d\n", variable); }
|
||||
|
||||
function function1(variable2) {
|
||||
variable2++;
|
||||
printf("Η τιμή της μεταβλητής variable2 είναι: %d\n", variable2); }
|
||||
|
||||
Όταν εκτελέσουμε το πρόγραμμα θα δούμε πως θα μας τυπωθούν στην οθόνη δύο γραμμές. Η πρώτη γραμμή (που θα προέρχεται από την συνάρτηση) θα λέει πως η variable2
|
||||
είναι ίση με 1, ενώ η δεύτερη θα λέει πως η variable είναι ίση με 0. Βλέπετε, λοιπόν, πως η τιμή της variable αντιγράφεται στην variable2 και δεν αλλάζει.
|
||||
|
||||
### [6.3 Η δήλωση return]{#ss6.3}
|
||||
|
||||
H return έχει δύο λειτουργίες: είτε να επιστρέψετε την τιμή της παραμέτρου, είτε να βγείτε από την συνάρτηση νωρίτερα. Η σύνταξή της είναι: return
|
||||
όνομα\_μεταβλητής. Μπορείτε σε κάθε συνάρτηση να επιστρέψετε την τιμή *μόνο μίας μεταβλητής*, **όχι παραπάνω**. Ας δούμε το παράδειγμα:
|
||||
|
||||
BEGIN { variable = 0; function1(variable);
|
||||
printf("Η τιμή της μεταβλητής variable είναι: %d\n", variable); }
|
||||
|
||||
function function1(variable2) {
|
||||
variable2++;
|
||||
printf("Η τιμή της μεταβλητής variable2 είναι: %d\n", variable2);
|
||||
return variable2; }
|
||||
|
||||
Σε αυτήν την περίπτωση, θα τυπωθούν δύο γραμμές πάλι. Και στις δύο γραμμές η τιμή των μεταβλητών θα είναι ίση με 1, καθώς η τιμή της variable2 επέστρεψε στην
|
||||
τιμή της variable.
|
||||
|
||||
### [6.4 Η συνάρτηση system]{#ss6.4}
|
||||
|
||||
Η συνάρτηση system είναι ενσωματωμένη στην awk. Είναι διαφορετική από τις άλλες, δεν ανήκει ούτε στην κατηγορία των αριθμητικών ούτε στην κατηγορία των
|
||||
αλφαριθμητικών συναρτήσεων. Αυτό που πραγματικά κάνει είναι να εκτελεί το αλφαριθμητικό που της δόθηκε ως παράμετρος, επιτρέποντας στον προγραμματιστή να
|
||||
εκτελεί απ\'ευθείας εντολές μέσα από το πρόγραμμα. Η σύνταξη της system έχει ως εξής:
|
||||
|
||||
system ("εντολή")
|
||||
|
||||
|
||||
### [7. Βιβλιογραφία]{#s7}
|
||||
|
||||
Για την επίτευξη αυτού του άρθρου (συμπεριλαμβανομένου, φυσικά, και του 1ου μέρους) συμβουλεύτηκα τις εξής πηγές:
|
||||
|
||||
- Την man page της εντολής gawk (man gawk)
|
||||
- Το βιβλίο \"Linux Unleashed\" της SAMS
|
||||
- Το βιβλίο \"UNIX: Θεωρία και πράξη\" του Κώστα Ν. Γιαλελή
|
||||
|
||||
Αν θα θέλατε να κάνετε ένα βήμα παραπάνω από το άρθρο, θα σας συμβούλευα πριν ψάξετε οπουδήποτε αλλού, να διαβάσετε τουλάχιστον μία φορά το man page της gawk.
|
||||
Είναι πολύ κατατοπιστικό και πολύ περιεκτικό.
|
||||
|
88
content/articles/24/04_perldbi.md
Κανονικό αρχείο
88
content/articles/24/04_perldbi.md
Κανονικό αρχείο
|
@ -0,0 +1,88 @@
|
|||
+++
|
||||
title = 'DataBaseInterface για Perl μέρος 2ο'
|
||||
date = '2000-06-01T00:00:00Z'
|
||||
description = ''
|
||||
author = 'Μιχάλης Καμπριάνης(mailto:kabrianis@hellug.gr)'
|
||||
issue = ['Magaz 24']
|
||||
issue_weight = 4
|
||||
+++
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
*Σε αυτό το τεύχος συνεχίζουμε την προσέγγιση στον προγραματισμό Perl για Databases μέσω του DBI interface που ξεκινήσαμε στο τεύχος Απριλίου.*
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
Αυτή τη φορά θα ασχοληθούμε με απλά κολπάκια για καλύτερο προγραμματισμό, τα οποία δεν αναφέραμε στο εισαγωγικό άρθρο. Ξεκινάμε:
|
||||
|
||||
1. Έλεγχος λαθών
|
||||
|
||||
Είχαμε πει στο προηγούμενο τεύχος ότι πρέπει ο προγραμματιστής να ελέγχει το exit status κάθε function που καλεί, για να δει αν πέτυχε ή όχι. Σε περίπτωση
|
||||
που δεν πέτυχε μπορεί να κάνει κάποιες δουλειές, αλλά συνήθως θέλει να σταματάει η εργασία εκεί. Γι αυτό το DBI παρέχει το RaiseError. Αμέσως μετά τη
|
||||
σύνδεση (ή και παράλληλα) μπορούμε να θέσουμε τη μεταβλητή RaiseError και τότε, σε κάθε error το πρόγραμμά μας θα σταματάει με ένα die.
|
||||
|
||||
Παράδειγμα 1
|
||||
$dbh=DBI->connect('DBI:Pg:dbname=dbname user=dbuser password=dbpass');
|
||||
$dbh->{RaiseError} = 1;
|
||||
|
||||
Η πρώτη γραμμή, απλά συνδέεται σε μία postgres database, στην βάση με όνομα dbname, με username dbuser και password dbpass. Η δεύτερη γραμμή θέτει τη
|
||||
μεταβλητή RaiseError όπως λέγαμε. \`Αλλη μία μεταβλητή που μπορεί να τεθεί με αυτόν τον τρόπο, είναι η AutoCommit, για transactional databases. Αν δεν
|
||||
ξέρετε τι είναι transactional database, καλά θα κάνετε να διαβάσετε το manual της βάσης σας.
|
||||
|
||||
2. Απ\' ευθείας ανάθεση αποτελεσμάτων σε μεταβλητές
|
||||
|
||||
Εκτός από την παραδοσιακή μέθοδο που είδαμε στο προηγούμενο τεύχος, να τοποθετούμε δηλαδή τα αποτελέσματα σε ένα array (μία στήλη αποτελεσμάτων είναι
|
||||
αντίστοιχα ένα στοιχείο του array), μπορούμε να χρησιμοποιήσουμε την bind\_columns για να αναθέσουμε τα αποτελέσματα σε ήδη ορισμένες μεταβλητές.
|
||||
|
||||
Παράδειγμα 2
|
||||
$entoli = $dbh->prepare('SELECT phone,name FROM clients WHERE id=?');
|
||||
$entoli->execute($num);
|
||||
$entoli->bind_columns(\$phone,\$name);
|
||||
$entoli->fetch;
|
||||
|
||||
Το \$num καθώς και τα \$phone και \$name πρέπει προφανώς να τα έχουμε δηλώσει νωρίτερα. Προσοχή πρέπει να δοθεί στο ότι η bind\_columns δίνεται μετά την
|
||||
execute. Επίσης όπως βλέπετε δεν χρησιμοποιούμε την fetchrow\_array αλλά την σκέτη fetch για να τραβήξουμε τα στοιχεία από την βάση.
|
||||
|
||||
3. Casting και πέρασμα παραμέτρων από πριν Μία άλλη μέθοδος που υποστηρίζει το DBI είναι η bind\_param(). Αυτή δίνει εξ αρχής στην execute τις παραμέτρους που
|
||||
θα πάρει, δίνoντάς μας την δυνατότητα να κάνουμε και casting.
|
||||
|
||||
Παράδειγμα 2
|
||||
$entoli = $dbh->prepare('SELECT phone,name FROM clients WHERE id=?');
|
||||
$entoli->bind_param(1, $num, { TYPE => SQL_INTEGER });
|
||||
$entoli->execute();
|
||||
$entoli->bind_columns(\$phone,\$name);
|
||||
$entoli->fetch;
|
||||
|
||||
Σε αυτό το παράδειγμα πριν καλέσουμε την execute λέμε στο DBI ότι στο πρώτο placeholder (όπου placeholder είναι το ερωτηματικό, και το πρώτο βγαίνει από το
|
||||
1 που είναι το πρώτο όρισμα της bind\_param()) θα βάλει την τιμή \$num και θα πει στην βάση μας ότι είναι τύπου Integer. Αυτό σε ορισμένες περιπτώσεις είναι
|
||||
χρήσιμο, αν και το σε ποιες ακριβώς, αφήνεται ως άσκηση στον αναγνώστη :-) Αν λοιπόν θέλουμε για οποιονδήποτε λόγο να κάνουμε casting, αυτή είναι η μέθοδος
|
||||
που πρέπει να ακολουθήσουμε.
|
||||
|
||||
4. Αποθήκευση παραμέτρων σε hashed array
|
||||
|
||||
Αντί για την fetchrow\_array και την fetch που είδαμε πιο πάνω, μπορούμε να χρησιμοποιήσουμε και την fetchrow\_hashref() μέθοδο, για να τοποθετήσουμε τα
|
||||
αποτελέσματα που θα μας επιστρέψει η βάση σε ένα hash.\
|
||||
Για κάθε γραμμή αποτελεσμάτων που επιστρέφεται από την βάση, δημιουργείται ένα reference σε ένα array που περιέχει το field name σαν κλειδί και την τιμή του
|
||||
σαν value. Αν κάποιο value είναι Null, τότε επιστρέφεται με τιμή undef. Αυτό προσέξτε το γιατί σημαίνει ότι θα υπάρχει συνδυασμός κλειδί-τιμή στο hash που
|
||||
θα δημιουργηθεί (ενώ ίσως περίμενε κάποιος να μην υπάρχει καν αυτός ο συνδυασμός εφόσον η τιμή του είναι Null).\
|
||||
Αυτή η υλοποίηση δημιουργεί περισσότερο overhead στο πρόγραμμά μας απ\' ότι η fetchrow\_array και δεν είναι και πολύ μεταφέρσιμη μεταξύ των διαφορετικών
|
||||
βάσεων, συνεπώς αν δεν το χρειάζεστε, μην το χρησιμοποιήσετε.
|
||||
|
||||
5. Πληροφορίες από την βάση
|
||||
|
||||
Μπορούμε να πάρουμε όλα τα αποτελέσματα του select μας με την μέθοδο dump\_results() η οποία καλεί εσωτερικά την neat\_list και τυπώνει τα αποτελέσματα.Aν
|
||||
δεν δώσουμε παραμέτρους, θα τυπώσει μέχρι 35 χαρακτήρες (\$maxlen=35), μία γραμμή αποτελεσμάτων σε μία γραμμή του output (\$lsep=\'\\n\'), χωρισμένες οι
|
||||
στήλες με κόμματα (\$fsep=\',\') στο STDOUT (\$fh). Όλα αυτά μπορούμε να τα αλλάξουμε με τις μεταβλητές που ανέφερα.
|
||||
|
||||
Η βάση μας δίνει επίσης πληροφορίες για:
|
||||
|
||||
- NUM\_OF\_FIELDS (integer)\
|
||||
Ο αριθμός των πεδίων που θα επιστρέψει το select που έχουμε κάνει prepare.
|
||||
- NUM\_OF\_PARAMS (integer)\
|
||||
Ο αριθμός των παραμέτρων που περνάμε στην prepare (αυτά που λέγαμε για Placeholders).
|
||||
- NAME (reference σε array)\
|
||||
Ένα reference σε array που περιέχει τα ονόματα των πεδίων. Υπάρχουν αντίστοιχα και οι NAME\_lc και NAME\_uc που επιστρέφουν τα ίδια στοιχεία σε
|
||||
LowerCase και UpperCase αντίστοιχα.
|
||||
|
||||
Όλες οι παραπάνω παράμετροι είναι βέβαια read\_only.
|
||||
|
||||
Με αυτό το κείμενο τελειώσαμε την εισαγωγή στο DBI interface της perl. Διαβάστε πάλι την βιβλιογραφία από το προηγούμενο τεύχος και είστε έτοιμοι να ξεκινήσετε.
|
45
content/articles/24/05_odigos.md
Κανονικό αρχείο
45
content/articles/24/05_odigos.md
Κανονικό αρχείο
|
@ -0,0 +1,45 @@
|
|||
+++
|
||||
title = 'Οδηγός καλής συμπεριφοράς προς Linuxάδες'
|
||||
date = '2000-04-01T00:00:00Z'
|
||||
description = ''
|
||||
author = 'Ευριπίδης Παπακώστας(mailto:evris@hellug.gr)'
|
||||
issue = ['Magaz 24']
|
||||
issue_weight = 5
|
||||
+++
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
*Το κείμενο αυτό\... έχει νόημα :-). Ολόκληρο το κείμενο με τις σχετικές επεξηγήσεις, θα το βρείτε στο
|
||||
[DiLiMa](http://baza.eeea.gr/article.php3?sid=20000530224100) που θα κυκλοφορήσει σύντομα.*
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
Ένα Παραμύθι με Νόημα
|
||||
|
||||
*\"Μια φορά κι έναν καιρό, σε ένα απόμακρο χωριό, ζούσαν δέκα ψαράδες. Την εποχή εκείνη, κανείς άλλος δεν ήξερε να ψαρεύει και ούτε ενδιαφερόταν για το ψάρεμα.
|
||||
Αν μάλιστα οι ψαράδες έκαναν το αστείο να διδάξουν ψάρεμα στους ανθρώπους της πόλης, ή να τους δώσουν δωρεάν ψάρια εκείνοι τους κορόιδευαν και τους χλεύαζαν.*
|
||||
|
||||
*Οι κάτοικοι της πόλης, βλέπετε, τρώγανε μόνο έτοιμες προτηγανισμένες τηγανητές πατάτες που τους προμήθευε ο αφέντης μεγαλέμπορας.*
|
||||
|
||||
*Οι ψαράδες όμως επέμειναν. Σιγά σιγά, καλλιέργησαν και τη γη, κάναν μια μικρή φάρμα εκτροφής ζώων, άρμεγαν τα ζώα και επειδή ήταν όλοι φίλοι μεταξύ τους και
|
||||
ήταν λίγοι σε πληθυσμό, ο καθένας έκανε ότι του άρεσε και το πρόσφερε δωρεάν και χαμογελαστά στους υπόλοιπους. Όποιος δεν μπορούσε να φέρει σε πέρας κάποια
|
||||
δουλειά, μπορούσε να ρωτήσει τους παλιότερους κατοίκους του χωριού και εκείνοι με χαρά τον βοηθούσαν.*
|
||||
|
||||
*Σιγά σιγά, οι ταλαιπωρημένοι και στα πρόθυρα της ασιτίας κάτοικοι της πόλης ενδιαφέρθηκαν να μάθουν και αυτοί τον τρόπο ζωής του μικρού αυτού χωριού και
|
||||
άρχισαν να μαζεύονται στα περίχωρα του χωριού.*
|
||||
|
||||
*Ο πληθυσμός του χωριού αυξήθηκε. Οι νέοι κάτοικοι απαιτούσαν σαν κακομαθημένα παιδιά τα δωρεάν ψάρια τους (λες και κάποιος τους τα χρώσταγε) και
|
||||
κακοαναθρεμένοι όπως ήταν, άρχισαν να ζητάνε τσιπούρες, φιλέτο, λαχανάκια Βρυξελλών, πράγματα που οι παλιοί χωρικοί δε μπορούσαν (χωρίς τη συνεργασία των νέων)
|
||||
να φτιάξουν.*
|
||||
|
||||
*Αλλά αυτό που πραγματικά έφερνε σε απόγνωση τους γέροντες του χωριού, ήταν η συμπεριφορά των νέων στο σχολείο. Δεν έκαναν τις εργασίες τους, δε διάβαζαν τα
|
||||
βιβλία τους, δεν παίδευαν το μυαλό τους και δεν παρατηρούσαν τους γεροντότερους ώστε να προοδεύσουν. Αντί αυτού, συνεχώς έβριζαν τη δασκάλα τους όταν τους
|
||||
εξηγούσε πως αν είχαν διαβάσει το βιβλίο δε θα χρειαζόταν να διακόπτουν συνέχεια το μάθημα και να ρωτούν τα ίδια και τα ίδια.*
|
||||
|
||||
*Η κατάσταση αυτή συνεχίστηκε για πολύ καιρό, μέχρι που πέθαναν οι γεροντότεροι, χάθηκε η γνώση που είχαν και τελείωσαν από τις αποθήκες οι έτοιμες τροφές που
|
||||
με τόσο κόπο συσσώρευαν.*
|
||||
|
||||
*Πεινασμένοι και απογοητευμένοι οι κάτοικοι της πόλης, ξαναγύρισαν στον παλιό αφέντη τους. Με σκυμμένο το κεφάλι, παραδέχτηκαν πως ήταν λάθος τους να φύγουν από
|
||||
κοντά του και του ζήτησαν να τους πάρει στη δούλεψή του.*
|
||||
|
||||
*Αυτός άλλο που δεν ήθελε. Τώρα πια όλοι δουλεύουν γι\' αυτόν, για μια μερίδα προτηγανισμένες σάπιες πατάτες και κανένας δεν έχει μείνει για να επαναστατήσει
|
||||
εναντίον του.\"*
|
Φόρτωση…
Προσθήκη πίνακα
Προσθήκη υπερσυνδέσμου
Παράθεση σε νέο ζήτημα