Αυτό το commit περιλαμβάνεται σε:
infl00p 2022-03-23 20:14:33 +02:00
commit 8ec8e9bee2
451 αρχεία άλλαξαν με 46736 προσθήκες και 0 διαγραφές

30
content/articles/23/01_editorial.md Κανονικό αρχείο

@ -0,0 +1,30 @@
+++
title = 'Editorial'
date = '2000-04-01T00:00:00Z'
description = ''
author = 'Μιχάλης Καμπριάνης(mailto:kabrianis@hellug.gr)'
issue = ['Magaz 23']
issue_weight = 1
+++
----------------------------------------------------------------------------------------------------------------------------------------------------------------
*Καλώς ορίσατε στο **Magaz**\...*
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Τεύχος προεκλογικό (ψηφίστε μας :-) αυτό, λόγω ημερομηνίας βέβαια και όχι λόγω ύλης. Για να πω την αλήθεια, εγω θα ψήφιζα ΔΑΓΚΩΤΟ αυτόν που θα μου έλεγε ότι θα
ακολουθούσε το παράδειγμα του Μεξικού, να γεμίσει τα σχολεία ΜΟΝΟ με Linux και να σταθεί σαν επίσημο κράτος πίσω από το Linux. Αλλά τέλος πάντων, αυτό δεν είναι
επί του παρόντος.
Όπως είπαμε στο τεύχος 20, προσπαθούμε να επικεντρωθούμε σε τεχνικά θέματα, λίγο πιο advanced από το \"Πως βάζω ελληνικά στο Linux\" όχι επειδή το δεύτερο δεν
μας απασχολεί, αλλά επειδή έχει απαντηθεί και αναλυθεί τόσες πολλές φορές που πλέον καταντάει γελοίο. Βέβαια, το να αρχίσει το Magaz να έχει πιο advanced
θέματα, εξαρτάται αποκλειστικά και μόνο από τους αρθρογράφους του. Και αυτή τη φορά, οι αρθρογράφοι μας έκαναν τη χάρη να μας βοηθήσουν.
Έχουμε λοιπόν, [μία παρουσίαση της xbasic](02_xbasic.html) από τον Κώστα Τσακάλογλου σε αυτό το τεύχος, μία πρώτη προσέγγιση στον [προγραμματισμό με
gawk](03_gawk1.html) από τον DJ-Art, μία ελαφριά και επιφανειακή προσέγγιση της [χρήσης του Perl DBI](04_perldbi.html) και τεχνικές οδηγίες για την [εγκατάσταση
του apache με SSL και jserv](05_apachejserv.html) από τον Κώστα Γεωργακόπουλο.
Η [δημοσκόπηση αυτού του μήνα](http://magaz.hellug.gr/cgi-bin/poll23.cgi) καταπιάνεται με την αγαπημένη σας γλώσσα (αν προγραμματίζετε, ή αν θα προγραμματίζατε,
ποια θα προτιμούσατε να μάθετε).
Καλή ανάγνωση\...

238
content/articles/23/02_xbasic.md Κανονικό αρχείο

@ -0,0 +1,238 @@
+++
title = 'Xbasic'
date = '2000-04-01T00:00:00Z'
description = ''
author = 'Κώστας Τσακάλογλου(mailto:tsakf@hellug.gr)'
issue = ['Magaz 23']
issue_weight = 2
+++
----------------------------------------------------------------------------------------------------------------------------------------------------------------
*Μία γλώσσα προγραμματισμού Basic που έχει αρκετά στοιχεία C.*
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Κατά την τακτική επίσκεψη μου στους δικτυακούς χώρους πέρασα και από το site της [Sourceforge](http://Sourceforge.net). Στην προσπάθεια αναζήτησης εργαλείων
προγραμματισμού για το LINUX ζήτησα να δώ τι υπάρχει από Developement tools. Προσπαθώντας να δω τελικά με τι θα δουλέψω τώρα που έστησα και εγω επιτέλους το
Linuxάκι μου (SUSE 6.3) έπεσα επάνω σε ένα link που έγραφε Xbasic. Τι ωραία! Λές να υπάρχει κάτι ενδιαφέρον, αναρωτιέμαι.. Μια και γράφω σε Basic από την εποχή
του TRS-80 καλό θα ήταν να βρω κάτι που δεν θα μου αλλάξει και πολύ το στύλ μου. Ακολουθώντας τα διάφορα links πηγαίνω στην κατάλληλη σελίδα για να δω
τελοσπάντων τι πράγμα είναι αυτή η Xbasic. Επιλέγοντας να δω κάποια οθόνη από το πρόγραμμα βρέθηκα μπροστά στην παρακάτω εικόνα:
![](/23/img/xbasic.gif)
Αρκετά όμορφο περιβάλλον για να γράφει κανείς πρόγραμμα, για να δούμε όμως από ουσία τι λέει:
Ετσι αποφάσισα να κατεβάσω το πρόγραμμα και να το εγκαταστήσω στο μηχάνημά μου. Σύμφωνα με τις οδηγίες εγκατάστασης, έπρεπε να κατεβάσω το αρχείο
*xblinux.tar.gz* στο μηχάνημά μου και μετά να πληκτρολογήσω τις παρακάτω εντολές:
----------------------------------------------------------------------------------------------------------------------------------------------------------------
cd /
tar xfz xblinux.tar.gz
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Αφού λοιπόν το κατέβασμα έγινε μια χαρά και το tar έκανε την δουλειά του, ξεκινάω τα X (KDE). Ανοίγω το Bash Terminal και γράφω:
cd /usr/xb
xb
Ωραία ξεκίνησε μια χαρά και ήρθε η ώρα να γράψω τις πρώτες μου εντολές. Μόλις δίνω την εντολή για το ξεκίνημα συγγραφής νέου προγράμματος να και άλλη μια
έκπληξη.
----------------------------------------------------------------------------------------------------------------------------------------------------------------
'
'
' ######################
' ##### Entry () #####
' ######################
'
' Programs contain:
' 1. A PROLOG with type/function/constant declarations.
' 2. This Entry() function where execution begins.
' 3. Zero or more additional functions.
'
FUNCTION Entry ()
END FUNCTION
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Αυτό δεν θυμίζει λίγο στο ξεκίνημα για την C;
----------------------------------------------------------------------------------------------------------------------------------------------------------------
main()
{
}
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Προσπαθώντας έτσι να ρίξω μια ματιά στην γλώσσα για να δω περίπου τι κάνει, πέφτω επάνω στους τύπους των μεταβλητών. Αρχίζω και βλέπω τύπους που δεν υπάρχουν
στην MS-BASIC ούτε καν στην VISUAL BASIC. Είδα διάφορα ωραία πράγματα και τα παραθέτω. Πρώτα από όλα να ξεκινήσω με τον κατάλογο των επιθεμάτων.
----------------------------------------------------- ----------------------------------------------------- -----------------------------------------------------
\ SBYTE 8-bit signed integer
`@`
`@@` UBYTE 8 bit unsigned integer
\% SSHORT 16 bit signed integer
%% USHORT 16 bit unsigned integer
& SLONG 32 bit signed long integer
&& ULONG 32 bit unsigned long integer
\~ XLONG 32/64 bit signed machine integer
\$\$ GIANT 64 bit signed giant (financial) integer
! SINGLE IEEE single precision floating point
\# DOUBLE IEEE double precision floating point
\$ STRING STRING of unsigned bytes
----------------------------------------------------- ----------------------------------------------------- -----------------------------------------------------
Από τον παραπάνω πίνακα, οι τύποι SBYTE ,UBYTE,USHORT,ULONG,XLONG και GIANT δεν υπάρχουν στην MS-BASIC και VISUAL BASIC. Οι Unsigned τύποι καθαρά είναι τύποι
που υποστηρίζει η C. Για τον τύπο XLONG νομίζω ότι είναι μια χαρά για εφαρμογές προγραμματισμού συστήματος (systems programming).
Οι μεταβλητες όμως στην XBASIC μπορούν να έχουν και προθέματα που δείχνουν την χρήση των μεταβλητών στις διάφορες ρουτίνες και προγράμματα. Τα προθέματα που
μπορούν να χρησιμοποιηθούν στην XBASIC είναι:
----------------------------------------------------- ----------------------------------------------------- -----------------------------------------------------
\ SHARED Η μεταβλητή είναι διαθέσιμη σε όλες τις ρουτίνες
\#
\#\# EXTERNAL Η μεταβλητή είναι διαθέσιμη και σε άλλα προγράμματα
\$ LOCAL CONSTANT Η μεταβλητή έχει σταθερή τιμή για την τρέχουσα
ρουτίνα
\$\$ SHARED CONSTANT Η μεταβλητή έχει σταθερή τιμή και είναι διαθέσιμη σε
όλες τις ρουτίνες
----------------------------------------------------- ----------------------------------------------------- -----------------------------------------------------
Θέλει προσοχή όταν ορίζουμε και χρησιμοποιούμε μεταβλητές στην XBASIC. Όπως και στο Linuxάκι μας τα κεφαλαία / πεζά είναι σημαντικά για την ονοματολογία των
αρχείων, έτσι και στην XBasic τα κεφαλαία / πεζά δίνουν διαφορετικά ονόματα μεταβλητών άρα και διαφορετικές τιμές. Για αυτή την γλώσσα τα ονόματα COUNT, Count
και count είναι διαφορετικές μεταβλητές.
Σύμφωνα με προηγούμενα καταλαβαίνουμε ότι οι εντολές πρέπει να γράφονται αποκλειστικά με κεφαλαία γράμματα γιατί διαφορετικά η γλώσσα τις βλέπει σαν μεταβλητές.
Έτσι το:
FOR I%=1 to 100
είναι σωστό, ενώ το:
For I%=1 to 100
είναι λάθος γιατί η γλώσσα καταλαβαίνει ότι υπάρχει μια μεταβλητή For όπου δεν την κάνουμε τίποτα.
Παρακάτω συνέχισα την ανάγνωση και έπεσα στους τελεστές συγκρίσεων. Εκεί πάλι είδα στοιχεία από την C να ξεφυτρώνουν όπως οι τελεστές:
= ,<>,< ,<=,>=,>
μπορούν να εκφραστούν και αντίστοιχα με
==,!=,!>=,!>,!<,!<=
Επίσης αν ρίξουμε μια ματιά στον παρακάτω πίνακα θα δούμε τελεστές διευθύνσεων μνήμης (pointers) που τόσο αρέσουν στους προγραμματιστές της C και διάφορα άλλα
καλούδια όπως μετακινίσεις bit κλπ.
------------------- ------------------- ------------------- ------------------- ------------------- ------------------- ------------------- -------------------
\ ALT ΚIND CLASS OPERANDS RETURNS PREC COMMENTS
OP
& unary 10 AnyType Address 12 Address of Object
Data
&& unary 10 AnyType Address 12 Address of Object
Handle
! unary 9 Numeric T/F 12 Logical Not (TRUE
if 0, else FALSE)
!! unary 9 Numeric T/F 12 Logical Test (FALSE
if 0, else TRUE)
NOT \~ unary 9 Integer SameType 12 Bitwise NOT
\+ unary 8 Numeric SameType 12 Plus
\- unary 8 Numeric SameType 12 Minus
\>\>\> binary 7 Integer LeftType 11 Arithmetic Up Shift
\<\<\< binary 7 Integer LeftType 11 Arithmetic Down
Shift
\<\< binary 7 Integer LeftType 11 Bitwise Left Shift
\>\> binary 7 Integer LeftType 11 Bitwise Right Shift
\*\* binary 4 Numeric HighType 10 Power
/ binary 4 Numeric HighType 9 Divide
\* binary 4 Numeric HighType 9 Multiply
\\ binary 6 Numeric Integer 9 Integer Divide
MOD binary 6 Numeric Integer 9 Modul. (Int.Remain)
\+ binary 5 Numeric HighType 8 Add
\+ binary 5 String String 8 Concatenate
\- binary 4 Numeric HighType 8 Subtract
AND & binary 3 Integer HighType 7 Bitwise AND
XOR \^ binary 3 Integer HighType 6 Bitwise XOR
OR \| binary 3 Integer HighType 6 Bitwise OR
\> !\<= binary 2 NumStr T/F 5 Greater-Than
\>= !\< binary 2 NumStr T/F 5 Greater-Or-Equal
\<= !\> binary 2 NumStr T/F 5 Less-Or-Equal
\< !\>= binary 2 NumStr T/F 5 Less-Than
\<\> != binary 2 NumStr T/F 4 Not-Equal
= == binary 2 NumStr T/F 4 Equal(also
\"!\<\>\")
&& binary 1 Integer T/F 3 Logical AND
\^\^ binary 1 Integer T/F 2 Logical XOR
\|\| binary 1 Integer T/F 2 Logical OR
= binary NumStr RightType 1 Assignment
T/F T/F always returned
as XLONG
------------------- ------------------- ------------------- ------------------- ------------------- ------------------- ------------------- -------------------
Κάτι Address και bitwise shift έχουν κάποιο ενδιαφέρον για κάποιους που θέλουν να χρησιμοποιήσουν αυτές τις εντολές αλλά η μέχρι τώρα γνωστές Basic δεν τους
έδιναν αυτή την δυνατότητα.
Από μια πρώτη ματιά νομίζω ότι κάποιος που ξέρει BASIC και έχει αποφασίσει να αρχίσει να γράφει προγράμματα για το LINUX καλό είναι να ρίξει μια ματιά σε αυτή
την γλώσσα που εκ πρώτης όψεως υπόσχεται πολλά. Εκτός από τις εντολές που δίνουν την δύναμη της C στον προγραμματιστή υπάρχει και παράθυρο εργαλείων για την
κατασκευή μιας φόρμας. Κουμπιά και όλα τα Widgets των X μάλλον υποστηρίζονται. Λέω μάλλον γιατί δεν έχω προλάβει να αρχίσω να κάνω κάτι με αυτή την γλώσσα. Απλά
όταν την είδα με μια πρώτη ματιά μου άρεσε τόσο που αποφάσισα να μοιραστώ τις εντυπώσεις που με άλλους προγραμματιστές γράφοντας αυτό το κείμενο και
παρουσιάζοντάς το στο Magaz. Τον άλλο μήνα που θα έχω κάνει κάτι θα γράψω και νεότερα. Εχω σκοπό να κρατάω σημειώσεις για κάθε τι που κάνω και να παρουσιάζω
κάθε τόσο από τη στήλη του Magaz κάθε τι καινούργιο όπως θα το μαθαίνω. Αυτά τα λίγα για τώρα και τα ξαναλέμε στο επόμενο Magaz.

590
content/articles/23/03_gawk1.md Κανονικό αρχείο

@ -0,0 +1,590 @@
+++
title = 'Προγραμματισμός με gawk μέρος 1ο'
date = '2000-04-01T00:00:00Z'
description = ''
author = 'DJ Art(mailto:djart@hellug.gr)'
issue = ['Magaz 23']
issue_weight = 3
+++
----------------------------------------------------------------------------------------------------------------------------------------------------------------
*Το άρθρο αυτό έχει σκοπό να σας βοηθήσει στην εκμάθηση της γλώσσας προγραμματισμού awk. Μία \"εξειδικευμένη\" γλώσσα προγραμματισμού, ένα ιδιαίτερα δυνατό
εργαλείο στη διαχείρηση αρχείων κειμένου (text files), καθώς και δημιουργίας αναφορών, με το πλεονέκτημα ότι είναι και εύκολη στην εμάθηση και στην σύνταξη,
αλλά και ότι \"συγγενεύει\" με την C. Το πλήρες άρθρο αποτελείται από δύο μέρη, εδώ σας παρουσιάζεται το πρώτο, ενώ ετοιμάζεται και το 2ο :-)*
----------------------------------------------------------------------------------------------------------------------------------------------------------------
**1. Εισαγωγή**
---------------------------------------
- [1.1 Ιστορικά](#ss1.1)
- [1.2 Εφαρμογές](#ss1.2)
- [1.3 Δυνατότητες](#ss1.3)
**2. Τα πρώτα βήματα**
----------------------------------------------
- [2.1 Οι βασικές αρχές](#ss2.1)
- [2.2 Σύνταξη](#ss2.2)
- [2.3 Απλά Παραδείγματα](#ss2.3)
- [2.4 Awk Scripts](#ss2.4)
**3. Πρότυπα (και Πράξεις)**
----------------------------------------------------
- [3.1 Ειδικά πρότυπα](#ss3.1)
- [3.2 Πρότυπα κανονικών παραστάσεων](#ss3.2)
- [3.3 Πρότυπα σχεσιακών εκφράσεων](#ss3.3)
- [3.4 Λογικοί Τελεστές](#ss3.4)
- [3.5 Διάστημα προτύπων](#ss3.5)
**4. Πράξεις**
--------------------------------------
- [4.1 Εισαγωγή](#ss4.1)
- [4.2 Μεταβλητές](#ss4.2)
- [4.3 Αλφαριθμητικά](#ss4.3)
- [4.4 Πίνακες](#ss4.4)
### [1. Εισαγωγή]{#s1}
### [1.1 Ιστορικά]{#ss1.1}
Η gawk, ή καλύτερα η GNU awk, είναι μιά από τις πιο καινούριες εκδόσεις της γλώσσας προγραμματισμού awk, η οποία είχε δημιουργηθεί για το περιβάλλον UNIX από
τους Alfred Aho, Peter Weinberger και Brian Kernighan το 1977. Το όνομα awk προέρχεται από τα αρχικά γράμματα των επωνύμων των παραπάνω δημιουργών. Η σχεδίαση
της awk φαίνεται στη διατριβή τους: \"AWK - a pattern scanning and processing language\" Software-Practice and Experience, Ιούλιος 1978. Η awk έχει την καταγωγή
της σε ιδέες από την SNOBOL4, από την εντολή sed, από τα εργαλεία yacc και lex και από τη C. Επίσης, ο Kernighan είναι ένας από αυτούς που βοήθησε στη
δημιουργία της C και του UNIX, ενώ οι άλλοι δύο βοήθησαν στη δημιουργία του UNIX. Για ακριβώς αυτούς τους λόγους, θα δείτε πολλές ομοιότητες μεταξύ της C και
της awk. Υπάρχουν πολλές εκδόσεις της awk: η αυθεντική awk, η nawk, η POSIX awk και, φυσικά, η gawk, η οποία είναι βασισμένη στην POSIX awk.
### [1.2 Εφαρμογές]{#ss1.2}
H awk, σε όλες τις εκδόσεις, είναι μια γλώσσα επεξεργασίας και σύγκρισης προτύπων (patterns) με μεγάλη δύναμη σε αυτόν τον τομέα. Μπορεί να ψάξει ένα ή
περισσότερα αρχεία για εγγραφές (records) που ταιριάζουν μέ ένα δοσμένο πρότυπο. Όταν ταιριάξουν, μία καθορισμένη πράξη (action) εκτελείται. Σαν
προγραμματιστής, δεν χρειάζεται να ανησυχείτε για το άνοιγμα, την επαναλαμβανόμενη ανάγνωση των εγγραφών ή το κλείσιμο ενός αρχείου. Αυτές οι λεπτομέρειες
γίνονται αυτόματα για εσάς. Το να γράφετε μικρά awk προγράμματα είναι εύκολο λόγω της λειτουργικότητας της γλώσσας, πολλές διαδικασίες είναι αυτοματοποιημένες.
Θα βρείτε πολλές εφαρμογές για τη awk, όπως το να \"διαβάζετε\" δεδομένα από ένα αρχείο, να μετράτε συγκεκριμένες \"υπάρξεις\" μέσα σ\' αυτό, αλλά και να
δημιουργείτε εξειδικευμένες αναφορές (reports). Η γενική σύνταξη της awk μοιάζει πάρα πολύ/έχει πολλά κοινά σημεία με τη C. Εάν ήδη ξέρετε C, τότε γνωρίζετε
αρκετά πράγματα από τη awk. Από πολλές απόψεις, η gawk είναι μία ευκολότερη \"έκδοση\" της C. Αν δεν γνωρίζετε C, τότε θα την μάθετε ευκολότερα αν ήδη γνωρίζετε
awk.
ΣΗΜΕΙΩΣΗ: H awk δουλεύει με text αρχεία, όχι εκτελέσιμα. Επειδή τα εκτελέσιμα αρχεία περιέχουν χαρακτήρες που μοιάζουν με το τέλος εγγραφών (δηλαδή σύμβολα
αλλαγής σειράς), η awk μπερδεύεται. Αν θέλετε να επεξεργαστείτε εκτελέσιμα αρχεία, τότε χρειάζεστε την Perl ή, φυσικά, μία από τις \"πατροπαράδοτες\" γλώσσες
προγραμματισμού, όπως η C.
### [1.3 Δυνατότητες]{#ss1.3}
Η awk είναι ευλύγιστη, όπως το UNIX περιβάλλον, περιλαμβάνει προκαθορισμένες μεταβλητές, αυτοματοποιεί πολλές από τις \"διαδικασίες\" του κλασσικού
προγραμματισμού, παρέχει τη δυνατότητα των συμβατικών μεταβλητών, υποστηρίζει το μορφοποιημένο output της C και είναι εύκολη στη χρήση. Σας επιτρέπει να
συνδυάσετε τα πλεονεκτήματα των shell scripts με πολλά στοιχεία της C. Να σημειώσω πως δεν χρειάζετε να ορίζετε τον τύπο μιάς μεταβλητής (σε αντίθεση με τη C),
αφού η awk καταλαβαίνει τον τύπο τους όταν τις χρησιμοποιεί. Φυσικά, υποστηρίζει τους βρόγχους της C (if/else, do/while, for), αλλά δεν υποστηρίζει το
switch/case. Παρόλα αυτά, υποστηρίζει το printf() της C, αλλά και την εντολή print, μιά απλούστερη (από την printf) εντολή.
### [2. Τα πρώτα βήματα]{#s2}
### [2.1 Οι βασικές αρχές]{#ss2.1}
Για να χρησιμοποιήσετε την gawk, θα πρέπει να γράψετε ένα πρόγραμμα. Το πρόγραμμα αυτό θα το ονομάζουμε awk script. Το λέω αυτό, γιατί σε απλές εφαρμογές θα
παρατηρήσετε πως θα μπορούσατε αντί για την gawk να χρησιμοποιήσετε το grep. Στο grep, όμως, δεν γράφετε πρόγραμμα (script), αλλά του δίνετε παραμέτρους.
Φυσικά, το awk script δεν έχει περιορισμούς στο μέγεθος. Μπορείτε να το κάνετε όσο μεγάλο θέλετε. To πρόγραμμα που φτιάχνετε μπορεί να \"διαβαστεί\" από την
gawk με πολλούς τρόπους, από τους οποίους οι πιό συνηθισμένοι είναι η από την γραμμή εντολών ή από ένα αρχείο. Η gawk μπορεί επίσης να δεχθεί input με pipe
(διασωλήνωση) από άλλο πρόγραμμα ή ακόμα και από το ίδιο το πληκτρολόγιο (επί τόπου). Το output με τη σειρά του, μπορεί εκτός από το standard, να ανακατεθυνθεί
σε ένα αρχείο ή να διασωληνωθεί σε ένα άλλο πρόγραμμα.
### [2.2 Σύνταξη]{#ss2.2}
gawk -Fx 'πρόγραμμα' [αρχείο/α]
gawk -Fx -f αρχείοντολών [αρχείο/α]
Το **πρόγραμμα** είναι μία σειρά από εντολές της awk, ενώ **αρχείο\_εντολών** είναι ένα αρχείο που περιέχει εντολές της awk. To **αρχείο/α** (στο τέλος της
σύνταξης) είναι το όνομα του αρχείου στο οποίο θα γίνει η επεξεργασία που θέλουμε. Αν παραλείψουμε εκεί το αρχείο, τότε η gawk δέχεται input από την καθιερωμένη
μονάδα εισόδου (πληκτρολόγιο).
Κάθε εντολή της awk έχει την μορφή: **πρότυπο {πράξη}**\
Η awk \"σαρώνει\" γραμμή προς γραμμή το αρχείο και κάθε γραμμή συγκρίνεται με το πρότυπο. Αν ταιριάζει, τότε εκτελείται η αντίστοιχη πράξη. Αν από την παραπάνω
μορφή απουσιάζει το πρότυπο, τότε η πράξη εκτελείται για κάθε γραμμή, ενώ αν απουσιάζει η πράξη, τότε όλες οι γραμμές που ταιριάζουν με το πρότυπο εμφανίζονται
στην οθόνη. Την χρησιμότητα της επιλογής **-Fx** θα την δούμε παρακάτω.
### [2.3 Απλά Παραδείγματα]{#ss2.3}
Ο απλούστερος τρόπος να χρησιμοποιήσετε την awk είναι να γράψετε το πρόγραμμα στην γραμμή εντολών. Ας δούμε ένα απλό παράδειγμα:
----------------------------------------------------------------------------------------------------------------------------------------------------------------
$ cat arxeio.txt | gawk '{print NF ": " $0}'
2: Γεια σας
8: Σήμερα θα μάθουμε να προγραμματίζουμε με την gawk
4: Σας εύχομαι καλή επιτυχία!
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Για να δούμε τώρα τί κάνει το πρόγραμμα. Το αποτέλεσμα της εντολής cat arxeio.txt περνά σαν είσοδος στην gawk. Πρότυπο δεν έχουμε, επομένως η πράξη (μέσα στις
αγκύλες) εφαρμόζεται για κάθε γραμμή (του arxeio.txt). Από εκεί και πέρα η gawk εμφανίζει στην οθόνη των αριθμό των λέξεων, την άνω και κάτω τελεία, το κενό και
μετά τα περιεχόμενα (ανά γραμμή) του arxeio.txt. To NF είναι μια προκαθορισμένη μεταβλητή της gawk, η οποία παριστάνει των αριθμό των πεδίων σε κάθε εγγραφή.
Από default το κάθε πεδίο ξεχωρίζει από το άλλο με κενό (space) ή με tab, ενώ κάθε εγγραφή ξεχωρίζει με τον χαρακτήρα αλλαγής γραμμής. Επομένως, ας πώ τί κάνει
η NF με πιο απλά λόγια: παριστάνει τον αριθμό λέξεων σε κάθε γραμμή. Όντως, στην πρώτη γραμμή η λέξεις ήταν 2 κλπ. Το σύμβολο \$0 παριστάνει ολόκληρη την
εγγραφή, ενώ υπάρχουν τα σύμβολα \$1, \$2 κ.ο.κ. για τα πεδία. Για παράδειγμα, στην πρώτη γραμμή, το \$1 παριστάνει το πεδίο \"Γεια\", ενώ το \$2 το \"σας\".
Στην δεύτερη γραμμή το \$5 είναι το \"προγραμματίζουμε\".
Θα μπορούσατε να χρησιμοποιήσετε την ανακατεύθυνση του UNIX, ή απλά το όνομα του αρχείου για να καταλήξετε στο ίδιο αποτέλεσμα με την παραπάνω εντολή. Δείτε
άλλες δύο ισοδύναμες (με την παραπάνω) εντολές:
$ gawk '{print NF ": " $0}' < arxeio.txt
$ gawk '{print NF ": " $0}' arxeio.txt
### [2.4 Awk Scripts]{#ss2.4}
Ας δούμε πάλι το παραπάνω παράδειγμα, την εντολή **gawk \'{print NF \": \" \$0}\' arxeio.txt**. Θα μπορούσατε να απόφυγετε την πληκτρολόγηση της εντολής στην
γραμμή εντολών, αλλά να την συμπεριλάβετε σε ένα awk script. Προσέξτε πως στο awk script δεν πρέπει να γράψετε τα απλά εισαγωγικά, αφού αυτά χρησιμεύουν για να
μην ασχοληθεί ο φλοιός (shell) με το περιεχόμενό τους. Αν τα χρησιμοποιήσετε η gawk θα σας βγάλει ένα μήνυμα λάθους και, φυσικά, δεν θα έχετε το επιθυμητό
αποτέλεσμα. Οπότε, θα δημιουργήσετε ένα αρχείο **script.awk** που θα περιέχει τα εξής:
{print NF ": " $0}
Στη συνέχεια, θα τρέξετε το πρόγραμμα με την εξής εντολή:
gawk -f script.awk arxeio.txt
Να αναφέρω επίσης, πως η gawk και άλλες εκδόσεις της awk, οι οποίες συμβαδίζουν με το POSIX πρότυπο (standard) σας επιτρέπουν να χρησιμοποιήσετε περισσότερα του
ενός scripts μετά την επιλογή -f (π.χ. gawk -f script1 script2 script3 arxeio.txt). Θα σας συμβούλευα να προτιμήσετε να καλέσετε ένα μόνο script (και όχι πιο
πολλά) για να αποφύγετε διάφορα λάθη ή ενέργειες που μπορεί να σας μπερδέψουν.
### [3. Πρότυπα (και Πράξεις)]{#s3}
Στην gawk μπορείτε να χρησιμοποιήσετε πρότυπα 3 ειδών:
1. Ειδικά πρότυπα (special patterns)
2. Κανονικές παραστάσεις (regular expression patterns)
3. Σχεσιακές εκφράσεις (comparison patterns)
### [3.1 Ειδικά πρότυπα]{#ss3.1}
Η awk περιλαμβάνει δύο ειδικά πρότυπα: το **BEGIN** και το **END**. Η πράξη που ακολουθεί το πρότυπο **BEGIN** εκτελείται πρίν διαβαστεί οποιαδήποτε γραμμή του
αρχείου. Για αυτόν τον λόγο, το **BEGIN** χρησιμοποιείται συνήθως για εκτύπωση επικεφαλίδων ή για αρχική καταχώρηση σε μία μεταβλητή. Η πράξη που ακολουθεί το
**END** εκτελείται όταν έχουν επεξεργαστεί όλες οι γραμμές από το αρχείο.
Τα πρότυπα **BEGIN** και **END** είναι εντελώς προαιρετικά. Τα χρησιμοποιείτε αν θέλετε. Όμως, αν τα χρησιμοποιήσετε τότε μπορείτε να τα έχετε μόνο μιά φορά
μέσα στο πρόγραμμά σας. Μην χρησιμοποιήσετε δύο **BEGIN** ή δύο **END**. Παράδειγμα για τα **BEGIN** και **END** θα δούμε παρακάτω, όταν μιλήσουμε για
μεταβλητές.
### [3.2 Πρότυπα κανονικών παραστάσεων]{#ss3.2}
Κανονική παράσταση είναι μία σειρά χαρακτήρων που περικλείονται ανάμεσα σε ζευγάρι από / (slash). Για παράδειγμα, αν εκτελέσετε την:
gawk '/linux/' my_doc.txt
τότε θα εμφανιστούν στην οθόνη όλες οι γραμμές του αρχείου my\_doc.txt που περιέχουν τη λέξη linux.
Οι κανονικές παραστάσεις της gawk αποτελούνται από χαρακτήρες (όπως τα γράμματα της αλφαβήτου) και από μεταχαρακτήρες (metacharacters). Οι μεταχαρακτήρες είναι
και αυτοί χαρακτήρες που έχουν ειδικό νόημα: δεν χρησιμοποιούνται για \"ταίριασμα\" με πεδίο ή εγγραφή ενός αρχείου, αλλά εκτελούν μιά συγκεκριμένη λειτουργία.
Ας δούμε, λοιπόν, έναν πίνακα με τους μεταχαρακτήρες και την συμπεριφορά τους:
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
\ **Συμπεριφορά**
**Μεταχαρακτήρας**
\\ Ακυρώνει την έννοια του ειδικού χαρακτήρα που ακολουθεί την backslash,\
οπότε ο ειδικός χαρακτήρας αντιμετωπίζεται σαν απλός
\^ Σύγκριση (matching) στην αρχή της γραμμής
\$ Σύγκριση στο τέλος της γραμμής
/\^\$/ Σύγκριση για κενή γραμμή
. Συγκρίνει οποιονδήποτε απλό χαρακτήρα
\[ΑΒΓ\] Συγκρίνει για οποιονδήποτε από τους Α, Β ή Γ
\[Α-Γα-γ\] Συγκρίνει για οποιονδήποτε από τους Α, Β, Γ, α, β, ή γ
\[\^ΑΒΓ\] Συγκρίνει για οποιονδήποτε άλλο χαρακτήρα εκτός των Α, Β ή Γ
Linux\|System Συγκρίνει για την λέξη Linux ή για την System (λογικό OR)
\[ΑΒΓ\]\[ΔΕΖ\] Συγκρίνει για τους Α, Β ή Γ, οι οποίοι όμως,θα πρέπει να ακολουθούνται\
από οποιονδήποτε των Δ, Ε ή Ζ
\[XYZ\]\* Συγκρίνει για καμμία ή περισσότερες εμφανίσεις της παράστασης\[XYZ\]
\[XYZ\]+ Συγκρίνει για μία ή περισσότερες εμφανίσεις της παράστασης\[XYZ\]
\[XYZ\]? Συγκρίνει για καμμία ή μία εμφάνιση της παράστασης\[XYZ\]
() Συνδυάζει κανονικές παραστάσεις. Π.χ. το (ανα\|δια)λύω συγκρίνει για να\
βρεί είτε τη λέξη αναλύω είτε τη λέξη διαλύω
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
#### Παραδείγματα
Ας δούμε την παρακάτω κανονική παράσταση:
/[Mm]agaz|interesting$/
Αυτή η παράσταση αναζητά τις γραμμές στις οποίες βρίσκονται οι λέξεις Magaz ή magaz (σε οποιοδήποτε σημείο της γραμμής) ή interesting (στο τέλος της γραμμής).
Ας δούμε άλλη μία παράσταση:
/[Mm][Aa][Gg][Aa][Zz]/
Αυτή η παράσταση αναζητά τις γραμμές στις οποίες βρίσκεται η λέξη magaz ΜΕ ΟΠΟΙΟΝΔΗΠΟΤΕ τρόπο γραμμένη, δηλαδή μπορεί να \"ξεθάψει\" την λέξη ακόμα και αν αυτή
είναι γραμμένη με έναν από τους συνολικά 32 τρόπους!! (δηλ. Magaz, MAgaz, MAGaz, MAGAz, MAGAZ, mAgaz κ.ο.κ.)
### [3.3 Πρότυπα σχεσιακών εκφράσεων]{#ss3.3}
Με τις σχεσιακές εκφράσεις γίνεται σύγκριση αριθμών ή αλφαριθμητικών (strings). H σύγκριση γίνεται με τους σχεσιακούς τελεστές, οι οποίοι είναι παρόμοιοι με
αυτούς της C και των φλοιών (shells) του UNIX. Μέχρι τώρα είδαμε πως οι κανονικές παραστάσεις \"σαρώνουν\" όλη τη γραμμή για να βρούν αυτό που ζητάμε. Μπορούμε,
όμως, να συνδυάσουμε τις κανονικές παραστάσεις με τις σχεσιακές εκφράσεις για να \"ψάξουμε\" σε συγκεκριμένα πεδία. Ας δούμε πρώτα όμως, έναν πίνακα με τους
σχεσιακούς τελεστές:
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
\ **Ερμηνεία**
**Τελεστής**
== Ίσο με
\< Μικρότερο
\> Μεγαλύτερο
\<= Μικρότερο ή ίσο
\>= Μεγαλύτερο ή ίσο
!= Διάφορο του
\~ Ίσο με την ακόλουθη κανονική παράσταση
!\~ Διάφορο της ακόλουθης κανονικής παράστασης
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
#### Παραδείγματα
Ας δούμε ένα \"τυπικό\" παράδειγμα εφαρμογής των παραπάνω τελεστών:
$1 == "Linux" { print "Linux Rocks!!" }
Η παραπάνω εντολή ελέγχει αν το πρώτο πεδίο είναι η λέξη Linux και αν είναι εκτελεί την πράξη, δηλαδή στην περίπτωσή μας εμφανίζει στην οθόνη το μήνυμα Linux
Rocks!! Προσέξτε ότι εδώ τα πράγματα είναι όπως ακριβώς φαίνονται, δηλαδή αν το πρώτο πεδίο είναι η λέξη linux (το l όχι κεφαλαίο όπως το δηλώσαμε), τότε δεν θα
εκτελεστεί η πράξη. Επομένως, ας δούμε τη χρησιμότητα του συνδυασμού της κανονικής παράστασης με τις σχεσιακές εκφράσεις:
\$6 !\~ /\[Mm\]\[Aa\]\[Gg\]\[Aa\]\[Zz\]/ { print \"we have no magaz\" }
Η παραπάνω εντολή ελέγχει αν το 6ο πεδίο περιέχει τη λέξη magaz (όπως και αν είναι γραμμένη) και όταν δεν τη βρεί τυπώνει αυτό που περιέχεται στα εισαγωγικά της
print.
### [3.4 Λογικοί Τελεστές]{#ss3.4}
Οι λογικοί τελεστές που χρησιμοποιούνται στην awk είναι παρόμοιοι με αυτούς της C. Χρησιμοποιούμε τους τελεστές αυτούς για να συνδυάσουμε πρότυπα (σχεσιακές
εκφράσεις ή κανονικές παραστάσεις) ώστε να \"συνθέσουμε\" μιά πολύπλοκη μορφή λογικής. Ας δούμε έναν πίνακα με τους λογικούς τελεστές:
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
\ **Ερμηνεία**
**Τελεστής**
&& Λογικό ΚΑΙ (AND)
\|\| Λογικό Η (OR)
! Λογικό ΟΧΙ (NOT)
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Ας δούμε ένα παράδειγμα:
$3 == "Linux" && $18 == "Magaz" {print "Μήνυμα εξόδου")
Εδώ, το πρότυπό μας, στην περίπτωση που το 3ο πεδίο είναι η λέξη Linux ΚΑΙ το 18ο πεδίο η λέξη Magaz, τυπώνει στην οθόνη το μήνυμα.
### [3.5 Διάστημα προτύπων]{#ss3.5}
Μπορείτε στη θέση ενός προτύπου να χρησιμοποιήσετε ένα διάστημα προτύπων. Το διάστημα προτύπων είναι δύο πρότυπα, τα οποία χωρίζονται με κόμμα (,) και
χρησιμεύουν στο εξής: Η πράξη που τα ακολουθεί, εφαρμόζεται σε όλες εκείνες τις γραμμές που βρίσκονται ανάμεσα στη γραμμή που εμφανίζεται το πρώτο πρότυπο και
στη γραμμή που εμφανίζεται το δεύτερο πρότυπο. Παράδειγμα:
/Linux/,/Magaz/
Η gawk θα αναζητήσει εκείνες τις γραμμές, από εκείνη που εμφανίζεται η λέξη Linux μέχρι εκείνη που εμφανίζεται η λέξη Magaz.
### [4. Πράξεις]{#s4}
### [4.1 Εισαγωγή]{#ss4.1}
Οι πράξεις είναι αυτές που λένε στην awk \"τί να κάνει\" όταν το πρότυπο ταιριάξει με αυτό που του ζητήσαμε. Μία πράξη αποτελείται από μία ή περισσότερες
εντολές, οι οποίες μοιάζουν πάρα πολύ με τις εντολές τις C. Μία πράξη μπορεί να περιέχει:
- Μεταβλητές
- Πίνακες
- Ενσωματωμένες συναρτήσεις (αλφαριθμητικές και αριθμητικές)
- Εντολές ελέγχου ροής
- Εκτυπώσεις
Οι πράξεις γράφονται μέσα σε αγκύλες ({}). Ο μόνος περιορισμός που έχετε, είναι να γράψετε την πρώτη αγκύλη στην ίδια γραμμή με το πρότυπο. Αυτός, βέβαια, είναι
ο μόνος σας περιορισμός.
Υπάρχουν κανόνες για τον τρόπο με τον οποίο γράφετε ένα awk script. Ευτυχώς, οι κανόνες αυτοί είναι σχεδόν ίδιοι με τους κανόνες της C: γενικά, στην συγγραφή
ενός προγράμματος, έχετε μιά ελευθερία με τα κενά, τις γραμμές κλπ. Ας τα δούμε, όμως, από την αρχή. Μέσα σε ένα script, οι κενές γραμμές αγνοούνται. Οι εντολές
που γράφετε μπορούν είτε να είναι στην ίδια γραμμή είτε σε διαφορετική. Η awk αναγνωρίζει τα κενά με τον ίδιο τρόπο που τα αναγνωρίζει η C. Οι επόμενες δύο
γραμμές είναι ακριβώς οι ίδιες:
$1=="Linux"{print"μήνυμα 1"}
$1 == "Linux" { print "μήνυμα 1" }
Εννοείται πάντως, πως διαφόρων ειδών κενά μέσα στα εισαγωγικά δεν αγνοούνται. Τα υπόλοιπα κενά (μέσα στον κώδικα) αγνοούνται. Μπορείτε επίσης, να \"σπάτε\" τις
εντολές σε πολλές γραμμές:
$1 == "Linux" {
print "μήνυμα 1"
}
Μπορείτε να έχετε πολλές διαφορετικές πράξεις μέσα στις αγκύλες ({}). Μπορείτε να τις χωρίζετε με το ελληνικό ερωτηματικό (;):
$1 == "Linux" {print "μήνυμα 1"; print "μήνυμα 2"; print μήνυμα 3";}
Όμως, έχετε τη δυνατότητα να μην χρησιμοποιήσετε το ελληνικό ερωτηματικό, αλλά να γράψετε κάθε εντολή της πράξης σε διαφορετική γραμμή. Το ακόλουθο παράδειγμα
έχει το ίδιο αποτέλεσμα με το παραπάνω:
$1 == "Linux" {
print "μήνυμα 1"
print "μήνυμα 2"
print "μήνυμα 3"
}
Επίσης, μπορείτε να έχετε σχόλια (comments) μέσα στο script σας. Αυτό μπορείτε να το κάνετε χρησιμοποιώντας το σύμβολο **\#** μπροστά από κάθε γραμμή σχόλιου.
### [4.2 Μεταβλητές]{#ss4.2}
Οι μεταβλητές σας χρειάζονται, φυσικά, για να έχετε τη δυνατότητα να αποθηκεύετε δεδομένα μέσα σε ένα πρόγραμμα. Υπάρχουν τριών ειδών μεταβλητές στην awk:
- Μεταβλητές πεδίου
- Προκαθορισμένες μεταβλητές
- Καθορισμένες από το χρήστη μεταβλητές
Από όλα αυτά τα είδη έχουμε δεί παραδείγματα των πρώτων δύο ειδών. Τις μεταβλητές πεδίου, όπως το \$1 και τις προκαθορισμένες μεταβλητές, όπως το NF κ.α.
Οι μεταβλητές που ορίζονται από το χρήστη είναι, όπως θα καταλάβατε, οι μεταβλητές που δημιουργείτε εσείς μέσα σε ένα πρόγραμμα για να σας εξυπηρετήσουν σε έναν
συγκεκριμένο σκοπό. Ένα πλεονέκτημα της awk είναι πως δεν χρειάζετε να ορίσετε τον τύπο της μεταβλητής που θα δημιουργήσετε. Δεν είναι π.χ. όπως στη C (και σε
άλλες) που ορίζετε το αν μία συγκεκριμένη μεταβλητή είναι integer, float, char κλπ. Στην awk απλά χρησιμοποιείτε την μεταβλητή (θυμάστε την BASIC ? :-) H awk
καταλαβαίνει τον τύπο της μεταβλητής, από το πώς αυτή χρησιμοποιείται μέσα στο πρόγραμμα. Αν για παράδειγμα, μέσα σε μιά μεταβλητή συμπεριλάβετε γράμματα και/ή
αριθμούς, τότε αυτή η μεταβλητή αναγνωρίζεται ως αλφαριθμητικό. Αν χρησιμοποιήσατε μόνο αριθμούς, τότε αυτή αναγνωρίζεται ως αριθμητική μεταβλητή.
Όπως και στη C, τα ονόματα των μεταβλητών που χρησιμοποιείτε ΠΡΕΠΕΙ να αρχίζουν με αλφαβητικό χαρακτήρα ή με μία κάτω παύλα/underscore (\_). Για το υπόλοιπο
όνομα της μεταβλητής μπορείτε να χρησιμοποιήσετε γράμματα, underscores ή αριθμούς. Οι αλφαβητικοί χαρακτήρες μπορούν να είναι είτε κεφαλαία είτε μικρά γράμματα.
Φυσικά, σε αυτό το σημείο πάντα δίνονται δύο (κλασσικές) συμβουλές: Η μία είναι να δίνετε στις μεταβλητές ονόματα περιγραφικά (δηλαδή, να καταλαβαίνει κάποιος
τί είναι το περιεχόμενό τους από το όνομά τους). Η δεύτερη συμβουλή είναι να αποφεύγετε όσο μπορείτε να γράφετε τις μεταβλητές με κεφαλαία γράμματα γιατί, όπως
θα δούμε παρακάτω, οι προκαθορισμένες μεταβλητές της awk είναι με κεφαλαία γράμματα, οπότε μπορεί εύκολα να γίνει λάθος.
Λοιπόν, ας δούμε τώρα έναν πίνακα με τις προκαθορισμένες (built-in variables) μεταβλητές της awk. Ο πίνακας έχει 3 στήλες. Στην 3η στήλη αναγράφεται, αν
υπάρχει, η default τιμή μιας μεταβλητής. Επίσης, να τονίσω ότι πολλές από τις παρακάτω μεταβλητές δεν υπάρχουν σε προηγούμενες εκδόσεις της awk (άλλωστε μιλάμε
για gawk):
----------------------------------------------------- ----------------------------------------------------- -----------------------------------------------------
\ **Σημασία** **Default Τιμή**
**Μεταβλητή**
ARGC Ο αριθμός των παραμέτρων που δίνονται στην γραμμή
εντολών
ARGV Πίνακας με όλες τις παραμέτρους που δίνονται στην
γραμμή εντολών
CONVFMT Η μορφή που η awk \"διαβάζει\" τους αριθμούς %.6g
ENVIRON Οι μεταβλητές περιβάλλοντος του UNIX
ERRNO Τα μηνύματα λάθους του UNIX
FILENAME Το όνομα του τρέχοντος αρχείου εισόδου
FNR Ο τρέχων αριθμός εγγραφής
FS Ο διαχωριστής πεδίων Space
IGNORECASE Ελέγχει την case sensitivity 0 (δηλ. υπάρχει case sensitivity)
NF Ο αριθμός των πεδίων στην τρέχουσα εγγραφή
NR Ο αριθμός των εγγραφών
OFMT Η μορφή εξόδου των αριθμών %.6g
OFS Ο διαχωριστής πεδίων για την έξοδο Space
ORS Ο διαχωριστής εγγραφών της εξόδου Newline
RS Ο διαχωριστής εγγραφών της εισόδου Newline
----------------------------------------------------- ----------------------------------------------------- -----------------------------------------------------
#### Αναλυτικά
- Η πρώτη παράμετρος που δίνετε στην γραμμή εντολών συμβολίζεται με ARGV\[0\], ενώ η τελευταία παράμετρος είναι η ARGV\[ARGC-1\]. Για την ακρίβεια, η πρώτη
\"παράμετρος\" που δίνουμε στην γραμμή εντολών είναι η ίδια η gawk. Αρα ARGV\[0\]=\"gawk\"
- Ας μιλήσουμε τώρα για εκείνη την παράμετρο **-Fx** που είδαμε στην σύνταξη της εντολής gawk. Εξ ορισμού, τα πεδία ξεχωρίζουν από τα κενά (ανεξάρτητου μήκους
κενά) μεταξύ τους. Τί γίνεται, όμως, αν θέλετε να επεξεργαστείτε ένα αρχείο σαν το /etc/passwd το οποίο δεν περιέχει κενά, αλλά παρόλα αυτά περιέχει πολλά
πεδία με πληροφορίες; Εδώ θα χρειαστεί να χρησιμοποιήσετε διαφορετικό από τον εξ ορισμού διαχωριστή πεδίων (field seperator). Αυτό μπορείτε να το κάνετε με
την παράμετρο **-Fx** όπου στη θέση του **x** θα βάλετε τον διαχωριστή που θέλετε. Για παράδειγμα, στο αρχείο /etc/passwd, σίγουρα θα θέλετε τα πεδία να
ξεχωρίζουν με το σύμβολο της άνω και κάτω τελείας (:). Επομένως, αρκεί να χρησιμοποιήσετε την παράμετρο **-F:**
Υπάρχει, όμως, εναλλακτικός τρόπος να ορίσετε τον διαχωριστή. Η μεταβλητή **FS** χρησιμοποιείται από την awk για αυτόν ακριβώς το λόγο. Επομένως, έχετε τη
δυνατότητα να χρησιμοποιήσετε αυτήν την μεταβλητή σε συνδυασμό με το ειδικό πρότυπο **BEGIN**. Π.χ. πρίν γράψετε οτοδήποτε άλλο στον κώδικά σας, μπορείτε να
γράψετε το:
BEGIN { FS = ":" }
- Θα καταλάβετε την μεταβλητή ENVIRON με το ακόλουθο παράδειγμα:
ENVIRON["TERM"] == "vt100" { print "Δουλεύετε σε VT100 !!" }
Η παραπάνω εντολή ελέγχει αν είστε σε VT100 τερματικο και, αν είστε, τυπώνει το μήνυμα.
- Είδατε δύο Default τιμές να είναι \"%.6g\". Για το τί σημαίνει αυτή η τιμή (και γενικά τιμές τέτοιου τύπου) θα μιλήσουμε όταν αναφερθούμε στις εκτυπώσεις
και, συγκεκριμένα, όταν αναφερθούμε στην \"printf\" (στο 2ο μέρος).
### [4.3 Αλφαριθμητικά]{#ss4.3}
Εδώ θα σας δώσω ένα παράδειγμα \"μεταχείρισης\" αλφαριθμητικών (άλλωστε, σε προηγούμενα παραδείγματα, θα έχετε ήδη καταλάβει τί/πώς/πού/κλπ. είναι τα
αλφαριθμητικα). Στη συνέχεια, θα μιλήσουμε για τις αλφαριθμητικές ενσωματωμένες συναρτήσεις και στο τέλος θα σας δώσω έναν πίνακα με ειδικές αλφαριθμητικές
σταθερές.
Τα αλφαριθμητικά πάντα γράφονται μέσα σε ζευγάρι διπλών εισαγωγικών (\"). Ένα αλφαριθμητικό μπορεί να περιέχει οποιουσδήποτε χαρακτήρες. Να σημειώσω πως αν
χρησιμοποιήσετε ΜΟΝΟ αριθμούς (π.χ. το \"156\") για ένα αλφαριθμητικό, τότε αυτόματα η awk το χρησιμοποιεί σαν αριθμητική μεταβλητή. Αντίθετα, αν έχετε ένα
αλφαριθμητικό (με χαρακτήρες ή ακόμα και \"μορφοποιημένο\" αριθμό: π.χ. \"+30 972 66 55 44\" \<\-- το οποίο για την gawk είναι αλφαριθμητικό, αφού περιέχει κενά
(\" \"). Προσέξτε, το \"+\" επιτρέπεται, όπως και το \"-\" σε αριθμητικές μεταβλητές) και προσπαθήσετε να κάνετε μιά αλγεβρική πράξη με αυτό (πρόσθεση,
αφαίρεση, κλπ \...) τότε η awk θα προσπαθήσει να μετατρέψει το αλφαριθμητικό σε αριθμητική μεταβλητή και, πολύ απλά, θα του δώσει την αριθμητική τιμή 0 (μηδέν).
Ας δούμε το παράδειγμα:
$ gawk 'BEGIN {x="αβγ""δεζ" ; y = "magaz"; z=x y; z2 = "A"x"LINUX"y"END"; print x, y, z, z2}'
αβγδεζ magaz αβγδεζmagaz AαβγδεζLINUXmagazEND
Είδατε, λοιπόν, πως μπορούμε να \"συνδυάσουμε\" αλφαριθμητικά. Είδατε επίσης, στη μεταβλητή x, πώς δεν είναι ανάγκη να συμπεριλάβουμε όλους τους χαρακτήρες στο
ίδιο ζεύγος εισαγωγικών. Ακόμα, στο τέλος, αν δεν είχαμε χρησιμοποιήσει το κόμμα (,) ανάμεσα στις μεταβλητές στην εντολή print, αυτό που θα μας έδινε η έξοδος
θα ήταν:\
αβγδεζmagazαβγδεζmagazAαβγδεζLINUXmagazEND
Ας δούμε τώρα τον πίνακα με τις συναρτήσεις. Και πάλι, μερικές από αυτές μπορεί να μην δουλεύουν σε παλιότερες εκδόσεις awk:
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
\ **Ερμηνεία**
**Συνάρτηση**
index(s1, s2) Επιστρέφει την θέση (από αριστερά) του αλφαριθμητικού s2 στο αλφαριθμητικό s1
length(string) Μετρά τον αριθμό χαρακτήρων του string
split(string, πίνακας, διαχωριστής) Δείτε παρακάτω, στα αναλυτικά
substr(string, m, n) Επιστρέφει εκείνο το τμήμα του αλφαριθμητικού string που αρχίζει από\
τη θέση m και έχει n χαρακτήρες
tolower(string) Επιστρέφει το string με μικρούς χαρακτήρες
toupper(string) Επιστρέφει το string με κεφαλαίους χαρακτήρες
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
#### Αναλυτικά
- Η split(string, πίνακας, διαχωριστής) καταχωρεί τα τμήματα του αλφαριθμητικού string που χωρίζονται μεταξύ τους με τον χαρακτήρα \"διαχωριστή\", στα
στοιχεία πίνακας\[1\], πίνακας\[2\], \... , πίνακας\[ν\] του πίνακα και επιστρέφει το ν. Αν δεν υπάρχει ο \"διαχωριστής\", τότε χρησιμοποιείται η μεταβλητή
FS. Παράδειγμα:
number = split("29/3/2000", array, "/")
Λοιπόν, μετά την εκτέλεση της εντολής θα έχουμε: array\[1\]=29, array\[2\]=3, array\[3\]=2000. H μεταβλητή number θα έχει την τιμή 3.
- Ας δούμε και ένα παράδειγμα για την substr. Έχουμε:
var=substr("Linux", 3, 2)
Μετά την εκτέλεση της εντολής, η μεταβλητή var θα περιέχει το αλφαριθμητικό \"nu\".
Παρακάτω, βλέπετε έναν πίνακα με ειδικές αλφαριθμητικές σταθερές, τις οποίες μπορείτε να χρησιμοποιήσετε μέσα σε ένα αλφαριθμητικό για συγκεκριμένες,
εξειδικευμένες \"εκτυπώσεις\". Π.χ. αν θα θέλατε μέσα σε ένα αλφαριθμητικό να χρησιμοποιήσετε τα διπλά εισαγωγικά (\") τότε θα πρέπει να γράψετε πρίν από αυτά
την backslash (\\) ώστε να μην \"μπερδευτεί\" η awk με τα εισαγωγικά που περιβάλλουν το αλφαριθμητικό:
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
\ **Σημασία**
**Σταθερά**
\\\\ Παριστάνει την ίδια την backslash
\\a Ο χαρακτήρας alert ή bell (Θα ηχήσει το speaker)
\\b Backspace
\\f Formfeed
\\n Newline
\\r Carriage return
\\t Tab
\\v Vertical Tab
\\\" Παριστάνει τα εισαγωγικά
\\xYY Δείχνει ότι ο ΥΥ είναι δεκαεξαδικός αριθμός
\\0YYY Δείχνει ότι ο ΥΥΥ είναι οκταδικός αριθμός
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
### [4.4 Πίνακες]{#ss4.4}
Όταν έχετε πολλά δεδομένα (π.χ. τιμές) που αφορούν στο ίδιο θέμα, τότε έχετε 2 επιλογές: είτε θα χρησιμοποιήσετε πολλές μεταβλητές, είτε θα χρησιμοποιήσετε έναν
πίνακα, ο οποίος σας επιτρέπει να έχετε συγκεντρωμένα πολλά δεδομένα. Ένας πίνακας αποτελείται από το όνομά του και τα στοιχεία του. Συμβολίζεται κάπως έτσι:
όνομα\[στοιχείο\].
Προσοχή!! Οι πίνακες στην awk έχουν ειδικές ικανότητες, οι οποίες δεν παρουσιάζονται στις περισσότερες γλώσσες προγραμματισμού. Είναι δυναμικοί πίνακες, πράγμα
που σημαίνει πως ξεφεύγουμε από το μαθηματικό μοντέλο του πίνακα (αν και πρέπει πάντα να το έχουμε στο μυαλό μας) καταργώντας τα \"αριθμημένα\" στοιχεία, δηλαδή
τις *διαστάσεις του πίνακα*. Το στοιχείο του πίνακα στην awk συμβολίζεται με αλφαριθμητικό!! Δεν χρειάζετε να δηλώνετε για μία συγκεκριμένη μεταβλητή πως είναι
πίνακας (όπως κάνουμε στη C), οπότε δεν δηλώνουμε εκ των προτέρων το μέγεθος που έχει ο πίνακάς μας. Όταν χρησιμοποιείτε ένα καινούριο στοιχείο για πρώτη φορά,
τότε αυτό δυναμικά προστίθεται στον πίνακά μας. Ας δούμε δύο παραδείγματα πινάκων:
magaz_subject["Linux"] = 1
magaz_subject["gardening"] = 0
Αν θα θέλαμε να κάνουμε το ίδιο σε άλλη γλώσσα προγραμματισμού, τότε θα έπρεπε να έχουμε 2 διαφορετικούς πίνακες, όπου στον έναν να είχαμε διάφορα θέματα και
στον άλλον πίνακα, στα ίδια στοιχεία να βάζαμε την τιμή 0 ή 1 (ανάλογα αν ανταποκρίνεται το magaz στα θέματα αυτά), οπότε κάθε φορά να κάναμε \"αντιστοίχιση\"
των πινάκων. Δηλαδή, για το παραπάνω παράδειγμα, ο ένας πίνακας ας υποθέσουμε ότι στη θέση 5 (στοιχείο 5 / array\[5\]) περιείχε το αλφαριθμητικό \"Linux\" και
στη θέση 6 το αλφαριθμητικό \"gardening\". Ο δεύτερος πίνακας θα είχε στη θέση 5 το 1 και στη θέση 6 το 0.
Η τακτική αυτή στην awk (δηλαδή η χρήση αλφαριθμητικού για στοιχείο) είναι \"λιγότερο προγραμματιστική-μαθηματική\" αλλά ευκολότερη στο διάβασμα. Η τακτική αυτή
οφείλεται για το γεγονός ότι η awk δεν υποστηρίζει άμεσα πολυδιάστατους πίνακες.
#### Συναρτήσεις πινάκων
Η awk περιλαμβάνει 2 συναρτήσεις για τους πίνακες: την in και την delete. Η συνάρτηση in ελέγχει την ύπαρξη ενός στοιχείου του πίνακα. Η delete σβήνει ένα
στοιχείο από έναν πίνακα.
Για παράδειγμα, μπορούμε να χρησιμοποιήσουμε την παρακάτω εντολή μέσα σε έναν βρόγχο if (τους οποίους θα δούμε στο 2ο μέρος) για να εξετάσουμε μιά ύπαρξη και να
εκτελέσουμε, ανάλογα, μιά πράξη:
"Linux" in magaz_subject
Ομοίως, χρησιμοποιούμε την συνάρτηση delete:
delete magaz_subject["gardening"]
Προσέξτε, ότι όταν χρησιμοποιείτε την delete, το στοιχείο σβήνεται από την περιοχή μνήμης. Τα δεδομένα δεν μπορούν να ανακτηθούν. Προσέξτε όμως, πως δεν
μπορείτε να χρησιμοποιήσετε την delete κάπως έτσι: delete magaz\_subject. Δεν μπορείτε να σβήσετε ολόκληρο τον πίνακα, αλλά μόνο τα στοιχεία του.
#### Πολυδιάστατοι Πίνακες
Είπαμε πως η awk δεν υποστηρίζει άμεσα πολυδιάστατους πίνακες, αλλά τους \"εξομοιώνει\". Το γεγονός αυτό, δεν σας επηρεάζει ως προγραμματιστές. Εσείς προχωράτε
κανονικά και δηλώνετε τους πολυδιάστατους πίνακες όπως ακριβώς και στη C, δηλαδή:
magaz_subject[6, 2] = "Linux"
Εννοείται πως μπορείτε να χρησιμοποιήσετε τις in και delete όπως ακριβώς και στους μονοδιάστατους.

223
content/articles/23/04_perldbi.md Κανονικό αρχείο

@ -0,0 +1,223 @@
+++
title = 'DataBaseInterface για Perl'
date = '2000-04-01T00:00:00Z'
description = ''
author = 'Μιχάλης Καμπριάνης(mailto:kabrianis@hellug.gr)'
issue = ['Magaz 23']
issue_weight = 4
+++
----------------------------------------------------------------------------------------------------------------------------------------------------------------
*Σε αυτό το μικρό αρθράκι θα κάνουμε μία πρώτη και επιφανειακή προσέγγιση σε προγραματισμό Perl για Databases μέσω του DBI interface*
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Η Perl είναι μία interpreted γλώσσα όπως όλοι ξέρουν. Και ως interpreted θεωρείται από αρκετούς \"κακή\" γλώσσα. Από την άλλη, είναι εξαιρετικά απλή σε σύνταξη.
Και επειδή είναι εξαιρετικά απλή, υπάρχουν εκατοντάδες προγραμματιστές που την επεκτείνουν, σε τομείς για τους οποίους δεν είχε σχεδιαστεί. Ένας από αυτούς τους
τομείς είναι οι DataBases.
**1. Τι παρέχει το DBI**
--------------------------------------------------
**2. Τι ΔΕΝ παρέχει το DBI**
------------------------------------------------------
**3. Συνηθισμένες συναρτήσεις**
---------------------------------------------------------
- [3.1 Connect](#ss3.1)
- [3.2 Select](#ss3.2)
- [3.3 Insert](#ss3.3)
- [3.4 Delete](#ss3.4)
- [3.5 Update](#ss3.5)
- [3.6 Do αντί για prepare() και execute()](#ss3.6)
- [3.7 Finsh και Disconnect](#ss3.7)
**4. \`Αλλα καλούδια**
------------------------------------------------
**5. Βιβλιογραφία**
---------------------------------------------
### [1. Τι παρέχει το DBI]{#s1}
Το module DBI (Database Interface) παρέχει τη δυνατότητα στην perl να μιλάει με μία database. Το module αυτό παρέχει κάποιες functions οι οποίες μιλάνε με
κάποιο underlying module, το οποίο λέγεται DBD. Υπάρχει ξεχωριστό DBD για κάθε βάση δεδομένων (π.χ. MySQL, Postgres, Oracle κλπ), και δεν παρέχουν όλα τις ίδιες
δυνατότητες, αλλά με την χρήση του DBI είσαστε λίγο-πολύ σίγουροι ότι ο κώδικας σας μεταφέρεται από την μία Database στην άλλη, χωρίς να ξαναγραφτούν όλες οι
functions από την αρχή. Ειδικά αν η SQL που γράφετε είναι \"κανονική\" SQL και όχι specific-database-enhanced SQL, είναι πολύ εύκολο (από πλευράς προγράμματος
και μόνο) να αλλάξετε βάση, ή να διανείμετε τον κώδικά σας χωρίς να σας ενδιαφέρει το τί βάση χρησιμοποιεί ο άλλος (αρκεί βέβαια να του ορίσετε το schema που θα
δημιουργήσει στην βάση του).
Βέβαια, αν χρησιμοποιήσετε το DBI για να εκτελέσετε triggers ή stored procedures σε μία βάση (κάτι που γίνεται), δεν μπορείτε να περιμένετε μεγάλη
μεταφερσιμότητα, κυρίως λόγω του διαφορετικού τρόπου με τον οποίο καλούν τα διάφορα triggers οι βάσεις. Συνεπώς, αν θέλετε να έχετε την ευελιξία να αλλάξετε
βάση αύριο - μεθαύριο χωρίς να σας βγουν τα μάτια να διαβάζετε καλά όλο τον κώδικα για να βρείτε τα databse-specific κομμάτια, σημειώστε καλά τα σημεία που τα
χρησιμοποιείτε και στο υπόλοιπο πρόγραμμα\.... stic k to SQL.
### [2. Τι ΔΕΝ παρέχει το DBI]{#s2}
Το DBI δεν παρέχει έναν τρόπο να μιλήσετε σε μία βάση χωρίς να ξέρετε SQL. To DBI είναι ένα απλό API, άρα αν δεν ξέρετε πως να σχεδιάσετε / υλοποιήσετε ένα
RDBMS και πως να αποθηκεύσετε, αλλάξετε, σβήσετε αρχεία με απλή SQL, μην συνεχίσετε να διαβάζετε, το άρθρο αυτό θα σας είναι εντελώς άχρηστο. Αντ\' αυτού
διαβάστε ένα βιβλίο για SQL πρώτα, και μετά ξαναελάτε.
### [3. Συνηθισμένες συναρτήσεις]{#s3}
### [3.1 Connect]{#ss3.1}
Για να ξεκινήσουμε να μιλάμε σε μία βάση, πρέπει πρώτα να συνδεθούμε σε αυτή τη βάση. Αυτό γίνεται απλά καλώντας την function \"connect\" του DBI. Όταν την
καλέσουμε, θα μας επιστρέψει ένα handler (αν επιτύχει βέβαια), και με αυτό το handler θα μιλάμε.
Παράδειγμα 1
$dbh=DBI->connect('DBI:Pg:dbname=dbname user=dbuser password=dbpass');
Η παραπάνω γραμμή, απλά συνδέεται σε μία postgres database, στην βάση με όνομα dbname, με username dbuser και password dbpass. Η database στο συγκεκριμένο
παράδειγμα πρέπει να είναι στο ίδιο μηχάνημα, και να \"ακούει\" στο standard port της Postgres, αλλιώς πρέπει να χρησιμοποιηθούν και οι παράμετροι host= και
port=. Σωστή προγραμματιστική τακτική λέει ότι πρέπει η μεταβλητή \$dbh πρέπει να έχει οριστεί νωρίτερα, και να ελεγχθεί αν πράγματι έχει τιμή αυτό που
επιστρέφεται (αν δηλαδή πέτυχε το connect).
Αυτή η συγκεκριμένη γραμμή είναι αρκετά διαφορετική από βάση σε βάση. Για παράδειγμα για Oracle, θα έπρεπε να γραφτεί ως εξής
Παράδειγμα 2
$dbh=DBI->connect('DBI:Oracle:dbname', 'dbuser', 'dbpass');
και αυτό οφείλεται στο ότι ο κάθε προγραμματιστής ενός DBD δεν ακολουθεί κάποιους κανόνες για το πως περνάει της παραμέτρους στην βάση του.
### [3.2 Select]{#ss3.2}
Αφού δημιουργήσαμε τη σύνδεση, πλέον στέλνουμε εντολές, στο \$dbh. Αυτό γίνεται σε δύο στάδια (εκτός από κάποιες περιπτώσεις που θα δούμε παρακάτω). Το πρώτο
στάδιο είναι να \"προετοιμάσουμε\" την εντολή, και το δεύτερο είναι να την εκτελέσουμε. Το να λάβουμε τα δεδομένα είναι άλλη υπόθεση (και τρίτο στάδιο). Για
παράδειγμα, για να εκτελέσουμε μία τυπική select σε ένα πίνακα, έστω clients, οι εντολές είναι :
Παράδειγμα 3
$entoli = $dbh->prepare('SELECT * FROM clients');
$entoli->execute();
Όσα είπαμε προηγουμένως για σωστή προγραμματιστική τακτική ισχύουν και εδώ (και σε όλο το άρθρο, οπότε θα σταματήσω να τα λέω), και απλά παραλείπονται μια που ο
καθένας προτιμάει τον δικό του τρόπο δήλωσης μεταβλητών και ελέγχου επιτυχίας της function.
Όπως βλέπουμε, η prepare() δίνει την εντολή, η οποία εκτελείται από την execute(). Αν τώρα θέλουμε να επιλέξουμε συγκεκριμένα στοιχεία από τον πίνακα, απλά
αντικαθιστούμε το \* με τα στοιχεία που θέλουμε. Έστω δηλαδή ότι θέλουμε τα στοιχεία client\_name και client\_tel από τον πίνακα, οι εντολές γίνονται:
Παράδειγμα 4
$entoli = $dbh->prepare('SELECT client_sname, client_tel FROM clients');
$entoli->execute();
Φυσικά, αν θέλουμε να περιορίσουμε την select μπορούμε μέσω του DBI, θέτοντας WHERE clauses. Ο σωστός τρόπος να γίνει αυτός είναι ο εξής:
Παράδειγμα 5
$entoli = $dbh->prepare('SELECT client_tel FROM clients WHERE client_sname = ?');
$entoli->execute('kabrianis');
Η παράμετρος η οποία θα αντικαταστήσει το ερωτηματικό (?) όταν εκτελεστεί η εντολή, είναι η παράμετρος η οποία μπαίνει ως όρισμα στην function execute(). Τελικά
δηλαδή θα εκτελεστεί στην Database η εντολή:
Παράδειγμα 6
SELECT client_tel FROM clients WHERE client_sname = 'kabrianis'
Προφανώς, μπορούμε να έχουμε περισσότερες από μία παραμέτρους στα WHERE clauses, αντικαθιστώντας τα αντίστοιχα ερωτηματικά με τις παραμέτρους, χωρισμένες με
κόμμα, στην αντίστοιχη execute(). Μπορούμε επίσης να έχουμε και subqueries, όπως:
Παράδειγμα 7
$entoli = $dbh->prepare('SELECT client_tel FROM clients WHERE client_addr = ?
AND client_sname in (SELECT client_sname FROM clients WHERE client_fname = ?)');
$entoli->execute('Athina','Michalis');
Αν μπερδευτήκατε, ξαναδιαβάστε SQL. Η εντολή είναι απλούστατη, και θα μας βρεί από την βάση μας (πίνακα clients) όσους έχουν διεύθυνση Athina και λέγονται
Michalis.
Όλα αυτά τα αποτελέσματα της SELECT μπορούν να διαβαστούν από εμάς, γραμμή - γραμμή, με την fetchrow\_array() μέθοδο της \$entoli, και βέβαια μας έρχονται σε
μορφή array. Για παράδειγμα, ο κώδικας του παραδείγματος 4 θα μας επιστρέφει arrays που θα περιέχουν τα client\_sname και client\_tel ως πρώτο και δεύτερο
στοιχείο του array. Το να τα κρατήσουμε σε μεταβλητές και να τα κάνουμε κάτι, είναι φυσικά εύκολο.
Παράδειγμα 8
while (@apotelesmata = $entoli->fetchrow_array()) {
$client_sname = $apotelesmata[0];
$client_tel = $apotelesmata[1];
##
## Εδώ κάνουμε κάτι με τα αποτελέσματα που πήραμε
##
}
### [3.3 Insert]{#ss3.3}
Η χρήση της INSERT είναι πολύ απλή, και μοιάζει με αυτή της SELECT. Για παράδειγμα για να βάλουμε άλλη μία γραμμή στον παραπάνω πίνακα (ο οποίος έστω ότι έχει
πεδία id, client\_sname, client\_fname και client\_addr) θα γράψουμε τα εξής:
Παράδειγμα 9
$entoli = $dbh->prepare('INSERT INTO clients VALUES (?,?,?,?)');
$entoli->execute($id,$client_sname,$client_fname,$client_addr);
Φυσικά εδώ η fetchrow\_array() δεν θα μας επιστρέψει τίποτα. Η ανωτέρω συνάρτηση μπορεί να επεκταθεί όσο θέλετε, με βάση πάντα τα όρια της SQL, προσθέτοντας
συγκεκριμένες τιμές, σε συγκεκριμένα πεδία (αν το επιτρέπει ο πίνακας που έχετε φτιάξει).
### [3.4 Delete]{#ss3.4}
Πραγματικά δεν θα περιμένετε κάτι διαφορετικό, έτσι; Ας πάμε κατυεθείαν στον κώδικα:
Παράδειγμα 10
$entoli = $dbh->prepare('DELETE FROM clients WHERE client_sname = ?');
$entoli->execute($client_sname);
και φυσικά, πάλι η fetchrow\_array() δεν θα επιστρέψει τίποτα. Subqueries μπορούν να χρησιμοποιηθούν, για να σβήσουμε συγκεκριμένες γραμμές ενός πίνακα, ακόμα
και χωρίς να δώσουμε καθόλου εξωτερικά στοιχεία.
### [3.5 Update]{#ss3.5}
\`Αλλη μία απλή εντολή, η update, έχει ακριβώς την ίδια σύνταξη με την insert και την delete.
Παράδειγμα 11
$entoli = $dbh->prepare('UPDATE clients SET client_tel = ? WHERE client_sname = ?');
$entoli->execute($client_tel,$client_sname);
Όπως είπαμε και πιο πάνω, οι παράμετροι της execute() διαβάζονται σειριακά, και αντικαθιστούν τα ερωτηματικά που βρίσκουν στην prepare(). Αυτό το ξανατονίζω
γιατί η update είναι ίσως η πιο \"επικίνδυνη\" εντολή, από την άποψη ότι μπορεί εύκολα να κάνεις λάθος, και να μην το καταλάβεις, και να κάνεις update όλες τις
εγγραφές ενός πίνακα αντί για μία - δύο που ήθελες.
### [3.6 Do αντί για prepare() και execute()]{#ss3.6}
Για τις εντολές insert, update και delete, οι οποίες ΔΕΝ επιστρέφουν τίποτα, το DBI παρέχει έναν τρόπο να αποφεύγουμε τις πολλές γραμμές κώδικα. Ο τρόπος είναι
να αντικαταστήσουμε τα prepare(), execute() και finish (που θα δούμε παρακάτω) με την απλή εντολή do.
Παράδειγμα 12
$entoli = $dbh->do('DELETE FROM clients WHERE client_id = 5');
Έτσι η εντολή DELETE προετοιμάζεται (prepare()), εκτελείται (execute()) και ο handler \$entoli τερματίζεται (finish) αυτόματα.
### [3.7 Finsh και Disconnect]{#ss3.7}
Πρέπει πάντα, να τερματίζουμε τον handler της εντολής μετά την εκτέλεσή της, και το fetching των γραμμών που μας επιστρέφει (αν μας επιστρέφει τίποτα φυσικά).
Συνεπώς, σε όλα τα παραπάνω παραδείγματα, πρέπει να προσθέσετε στο τέλος την γραμμή:
$entoli->finish;
ενώ πρέπει, όταν τελειώνουμε με την βάση μας, να κλείνουμε τη σύνδεση:
$dbh->disconnect;
### [4. \`Αλλα καλούδια]{#s4}
Εκτός από τα connect, disconnect, prepare, execute, do, finish και fetchrow\_arrays που είδαμε, υπάρχουν και άλλα καλούδια που παρέχονται από το DBI, τα οποία
μπορούν να χρησιμοποιηθούν για να κάνουν τη ζωή σας ευκολότερη. Ας κάνουμε μία σύντομη αναφορά σε κάποια (τα πιο χρήσιμα ίσως) από αυτά:
- prepare\_cached(): Αν αντί της prepare() χρησιμοποιήσουμε την prepare\_cached, τότε, κάθε φορά που θα εκτελείται ένα execute() με τις ίδιες ακριβώς
παραμέτρους, δεν θα γίνεται σύνδεση προς τη βάση, αλλά θα μας επιστρέφονται οι τιμές που έχουν γίνει cached κατά την πρώτη φορά.
- rows: Αν χρησιμοποιήσουμε την \$entoli-\>rows, θα μας επιστραφεί ο αριθμός των γραμμών που στέλνει η βάση μετά από ένα select.
- bind\_columns(): Αντί της fetchrow\_array() που είδαμε παραπάνω και του while που αναθέτουμε σε κάποιες μεταβλητές, τα στοιχεία του array που μας
επιστρέφονται, μπορούμε απλά να χρησιμοποιήσουμε την bind\_columns() δίνοντας ως παραμέτρους τα ονόματα των μεταβλητών. Τα δεδομένα από την βάση μας
έρχονται μέσω της fetch.
Το DBI μας παρέχει στην err τον κωδικό λάθους (αν υπάρχει κάποιο) κατά την εκτέλεση της εντολής, στην errstring το μήνυμα λάθους που επιστρέφει η database, και
στην state το SQLSTATE κωδικό λάθους. Χρήσιμες functions είναι οι trace, trace\_msg και η func.
### [5. Βιβλιογραφία]{#s5}
Καλό βιβλίο, και προτεινόμενο για DBI programming (και με κάποια στοιχεία SQL μέσα) είναι το Programming the Perl DBI από τις εκδόσεις O\'Reilly. Μην το ψάξετε
στον Παπασωτηρίου, δεν το έχει (και το ζητούσα 2 μήνες).\
Πολύ καλές πληροφορίες δίνει το manual page του DBI του ίδιου.\
Πρέπει επίσης να διαβάσετε το manual του DBD module της βάσης σας (αν φυσικά έχει ένα τέτοιο). Βιβλία για Perl και SQL ΔΕΝ θα προτείνω εδώ.

290
content/articles/23/05_apachejserv.md Κανονικό αρχείο

@ -0,0 +1,290 @@
+++
title = 'Apache mod\_ssl mod\_jserv installation'
date = '2000-04-01T00:00:00Z'
description = ''
author = 'Κώστας Γεωργακόπουλος(mailto:kgeorga@magnet.gr)'
issue = ['Magaz 23']
issue_weight = 5
+++
----------------------------------------------------------------------------------------------------------------------------------------------------------------
*Αυτό το κείμενο προσπαθεί να κάνει την εγκατάσταση του apache-ssl-jserv εύκολη ώστε οποιοσδήποτε, ακολουθώντας απλά τις εντολές, να μπορέσει να εγκαταστήσει το
ρημάδι.. Πάντως δούλεψε για μένα..*
----------------------------------------------------------------------------------------------------------------------------------------------------------------
**1. Tι πρέπει να ξέρετε.**
---------------------------------------------------------
**2. Απαραίτητα αρχεία και που θα τα βρείτε.**
----------------------------------------------------------------------------
**3. Εγκατάσταση χωρίς υποστήριξη DSO**
---------------------------------------------------------------------
- [3.1 Αρχίζοντας..](#ss3.1)
- [3.2 Εγκατάσταση των προαπαιτούμενων.](#ss3.2)
- [3.3 Εγκατάσταση του ApacheJserv](#ss3.3)
- [3.4 Eγκατάσταση του apache και του mod\_ssl με ένα μόνο configure (μαγεία!)](#ss3.4)
- [3.5 Τελευταία βήματα.](#ss3.5)
**4. Εγκατάσταση με υπστήριξη DSO (Dynamic Shared Object)**
-----------------------------------------------------------------------------------------
- [4.1 Aρχίζοντας.](#ss4.1)
- [4.2 Apache & mod\_ssl configuration σε ένα (ξανά!)](#ss4.2)
- [4.3 Εγκατάσταση ApacheJserv](#ss4.3)
- [4.4 Τελευταία βήματα.](#ss4.4)
- [4.5 Έλεγχος.](#ss4.5)
**5. Tι να προσέξετε.**
-----------------------------------------------------
**6. Feedback**
---------------------------------------------
### [1. Tι πρέπει να ξέρετε.]{#s1}
**Σύστημα εγκατάστασης**
: Slackware 7.0 (kernel 2.2.14)
**Σημειώσεις**
: - Αν ζείτε στις Η.Π.Α η εγκατάσταση είναι διαφορετική.
- Διαλέχτε είτε WITHOUT DSO είτε DSO installation..
- Υποθέτω οτι έχετε μια κάποια γνώση του configure script.
- Μετά τις 8/2/2000 τα ίδια βήματα ισχύουν για τον apache\_1.3.12 με mod\_ssl-2.6.0-1.3.12 .
### [2. Απαραίτητα αρχεία και που θα τα βρείτε.]{#s2}
Αναγκαία αρχεία και που θα βρείτε τις τελευταίες εκδόσεις τους..
mod\_ssl-2.5.0-1.3.11.tar.gz\
[www.modssl.org](http://www.modssl.org)
openssl-0.9.4.tar.gz\
[www.openssl.org](http://www.openssl.org)
ApacheJserv-1.1.tar.gz\
[java.apache.org](http://java.apache.org)
jdk-1.2.2-RC4-linux-i386-glibc-2.1.2.tar.gz (or .bz2 )\
<http://java.sun.com/products/servlet/download.html>
jsdk20-solaris2-sparc.tar.Z\
<http://java.sun.com/products/servlet/download.html>
apache-1.3.11.tar.gz\
[www.apache.org](http://www.apache.org)
### [3. Εγκατάσταση χωρίς υποστήριξη DSO]{#s3}
### [3.1 Αρχίζοντας..]{#ss3.1}
Διάλεγουμε ένα κατάλογο εργασίας (π.χ /root/work ) και αντιγράφουμε όλα τα παραπάνω αρχεία εκεί..
cd /root/work\
tar -zxvf mod\_ssl-2.5.0-1.3.11.tar.gz\
tar -zxvf openssl-0.9.4.tar.gz\
tar -zxvf ApacheJserv-1.1.tar.gz\
tar -zxvf jdk-1.2.2-RC4-linux-i386-glibc-2.1.2.tar.gz\
tar -zxvf jsdk20-solaris2-sparc.tar.gz\
tar -zxvf apache-1.3.11.tar.gz
### [3.2 Εγκατάσταση των προαπαιτούμενων.]{#ss3.2}
Εγκαθιστούμε τώρα τα αναγκαία από το jserv και το ssl πακέτα..
-openssl-0.9.4 (προαπαιτούμενο του mod\_ssl)-
cd openssl-0.9.4
./config
make
make test
cd ..
-jdk ( προαπαιτούμενο του by jserv)-
cd jdk-1.2.2-RC4-linux-i386-glibc-2.1.2
Απλή εγκατάσταση , δεν χρειάζεται compile ( βλέπε README )
οθέτουμε οτι τελικά εγκαθίσταται στο /usr/local/jdk
cd ..
-jsdk (προαπαιτούμενο του jserv)-
Tα ίδια με το προηγούενο.. Yποθέτουμε οτι τελικά εγκαθίσταται στο /usr/local/jsdk
### [3.3 Εγκατάσταση του ApacheJserv]{#ss3.3}
Κάνουμε ένα (προαπαιτούμενο από το jserv ) configure στο top directory του apache:
cd apache_1.3.11
./configure --prefix=/usr/local/apache
make install
cd ..
Eγκαθιστούμε το ΑpacheJserv :
cd ApacheJserv-1.1
./configure \
--prefix=/usr/local/jserv \
--with-apache-src=../apache_1.3.11 \
--with-jdk-home=/usr/local/jdk \
--with-JSDK=/usr/local/jsdk \
--enable-EAPI
make
make install
### [3.4 Eγκατάσταση του apache και του mod\_ssl με ένα μόνο configure (μαγεία!)]{#ss3.4}
Κάνουμε configure τον apache μέσω του mod\_ssl :
cd mod_ssl-2.5.0-1.3.11
./configure \
--prefix=/usr/local/apache \
--with-apache=../apache_1.3.11 \
--with-ssl=../openssl-0.9.4 \
--activate-module=src/modules/jserv/libjserv.a \
--enable-module=ssl \
--enable-suexec \ (OPTIONAL)
--suexec-caller=nobody (OPTIONAL)
[ ..more apache options.. ]
cd ..
Προσθέτουμε στο \"apache\_1.3.11/src/Configuration\" στο τέλος του αρχείου :
AddModule modules/jserv/libjserv.a
Κάνουμε μετά στον κατάλογο apache\_1.3.11 :
make
make certificate TYPE=custom (or TYPE=dummy)
make install
### [3.5 Τελευταία βήματα.]{#ss3.5}
Βάζουμε κάπου στο httpd.conf :
Include /usr/local/jserv/etc/jserv.conf
Κάνουμε επίσης : chmod o+w /usr/local/jserv/logs
Ξεκινάμε τον apache με υποστήριξη ssl :
/usr/local/apache/bin/apachectl startssl
Eλέγχουμε το jserv :
http://server.domain.com/servlets/Hello
Ελέγχουμε το ssl :
https://server.domain.com/
### [4. Εγκατάσταση με υπστήριξη DSO (Dynamic Shared Object)]{#s4}
### [4.1 Aρχίζοντας.]{#ss4.1}
Απλά επαναλάβετε τα βήματα 3.1 και 3.2 (χρειάζονται και εδώ :) )
### [4.2 Apache & mod\_ssl configuration σε ένα (ξανά!)]{#ss4.2}
cd mod_ssl-2.5.0-1.3.11
./configure \
--prefix=/usr/local/apache \
--with-apache=../apache_1.3.11/ \
--with-ssl=../openssl-0.9.4 \
--enable-shared=ssl \
--enable-rule=SHARED_CORE \
--enable-module=so \
--enable-suexec \ (OPTIONAL)
--suexec-caller=nobody (OPTIONAL)
[..more apache options..]
cd ..
cd apache_1.3.11
make
make certificate TYPE=custom (or TYPE=dummy)
make install
cd ..
### [4.3 Εγκατάσταση ApacheJserv]{#ss4.3}
cd ApacheJserv-1.1
./configure \
--prefix=/usr/local/jserv \
--with-apxs=/usr/local/apache/bin/apxs \
--with-jdk-home=/usr/local/jdk/ \
--with-JSDK=/usr/local/jsdk/
make
make install
### [4.4 Τελευταία βήματα.]{#ss4.4}
Bάζουμε κάπου στο httpd.conf :
Include /usr/local/apache/conf/jserv/jserv.conf
Επίσης στο AddModules section του httpd.conf:
AddModule mod_jserv.c
### [4.5 Έλεγχος.]{#ss4.5}
Ξεκινάμε τον apache με υποστήριξη ssl :
/usr/local/apache/bin/apachectl startssl
Eλέγχουμε το jserv :
http://server.domain.com/servlets/Hello
Ελέγχουμε το ssl :
https://server.domain.com/
:)
### [5. Tι να προσέξετε.]{#s5}
Εαν έχετε 2 ή παραπάνω apache δαίμονες να ακούνε σε διαφορετικές IP διευθύνσεις στο ίδιο μηχάνημα (π.χ με IP alias) τότε μάλλον έχετε ενεργοποιήσει την Listen
εντολή στο httpd.conf :
Listen xxx.yyy.zzz.vvv:80
Aν όντως συμβαίνει αυτό τότε κάντε σχόλιο την παρακάτω γραμμή στο httpd.conf στο οποίο έχετε ενεργοποιήσει την εντολή Listen :
.
.
#Listen 80 <-- σχόλιο
Listen 443
.
.
Εάν έχετε και τις 2 Listen εντολές ενεργοποιημένες τότε ο apache den Θα ξεκινήσει
### [6. Feedback]{#s6}
ΠΑΡΑΚΑΛΩ στείλτε μου πληροφορίες ( λάθη ή ο,τιδήποτε ) για να ξέρω αν σας βοήθησε καθόλου..\
e-mail : <kgeorga@magnet.gr> [kgeorga\@it.teithe.gr.gr](mailto:kgeorga@it.teithe.gr)