|
Regular Expressions
Οι δυνατότητες αναγνώρισης και διαχείρισης χαρακτήρων της Perl είναι ανώτερες, και ευκολότερες στη χρήση, από κάθε άλλης γλώσσας προγραμματισμού. Ωστόσο, οι πολλές επιλογές πάντα περιπλέκουν την εργασία του προγραμματιστή και γι αυτό οι ερωτήσεις σχετικά με pattern matching και substitution είναι πάρα πολύ συχνές στο comp.lang.perl usenet newsgroup.
Η συνηθέστερη μορφή pattern matching εμφανίζεται σε if statements όπως:
if ($something =~ m/giorgos/) { κάνε κάτι }
Το =~ σημαίνει «περιέχει ή υπάρχει» και αναφέρεται σε ό,τι βρίσκεται ανάμεσα στις //. Δηλαδή λέμε στην Perl πως αν η μεταβλητή ($something περιέχει την ακολουθία χαρακτήρων giorgos τότε θα πρέπει να εκτελεστεί το περιεχόμενο των {}.
Αν θέλαμε η $something να μην περιέχει την ακολουθία giorgos τότε αντί για =~ θα γράφαμε !~.
Όπως γνωρίζουμε και από την print υπάρχουν μερικοί χαρακτήρες (metacharacters) που η Perl τους χρησιμοποιεί για άλλες εργασίες και γι αυτό πρέπει να τους δηλώσουμε με ειδικό τρόπο αν τους επιθυμούμε αυτούσιους. Για παράδειγμα για να τυπώσουμε το ποσό «$35» θα γράψουμε print \$35\n; διότι διαφορετικά η Perl θα θεωρήσει πως το $35 αποτελεί όνομα μεταβλητής, ενώ χάρη στη \ θα καταλάβει ότι πρέπει να τυπώσει απλώς το σήμα του δολαρίου.
Ειδικοί χαρακτήρες υπάρχουν και στις regular expressions. Όποτε πρέπει να αναζητήσετε με ένα από τα:
^ . ? { ( ) / [ $ + * \ |
θα πρέπει να χρησιμοποιήσετε πριν από αυτά τη γνωστή μας backslash (\).
Αν για παράδειγμα επιθυμούμε να βρούμε το (35$) αυτό θα γραφτεί:
m/\(35\$\)/
Σημειώστε ότι το m δεν είναι απαραίτητο και οι // μπορούν να πάρουν και άλλη μορφή. Όταν η ακολουθία χαρακτήρων που δηλώνουμε βρίσκεται μέσα σε // τότε το m μπορεί να παραληφθεί. Είναι όμως υποχρεωτικό όταν αντί για // χρησιμοποιούμε κάποιον άλλο ειδικό χαρακτήρα. Οι παρακάτω εκφράσεις λοιπόν είναι ισοδύναμες:
m/giorgos/ /giorgos/ m|giorgos| m!giorgos! m%giorgos% κ.λπ.
Φυσικά στην περίπτωση που χρησιμοποιούμε κάποιον άλλο χαρακτήρα θα πρέπει να τον δηλώνουμε με ειδικό τρόπο αν αποτελεί και μέρος της αναζητούμενης ακολουθίας. Για παράδειγμα, αν αναζητούμε το «Η αύξηση των πωλήσεων έφτασε το 35% τον Ιανουάριο», αυτό θα γραφτεί:
m%Η αύξηση των πωλήσεων έφτασε το 35\% τον Ιανουάριο%
Πάντως καλύτερα να προτιμήσετε τις // εκτός αν έχετε κάποιο ειδικό λόγο (π.χ. υπάρχουν πολλές / μέσα στο pattern και βαριέστε να τις δηλώνετε με ειδικό τρόπο δηλαδή με \/).
Εκτός από απλές ακολουθίες χαρακτήρων (strings) η Perl μπορεί να διαχειριστεί και πιο περίπλοκες εκφράσεις όπως:
Χαρακτήρας |
Ιδιότητα |
\w |
Οποιοδήποτε γράμμα, αριθμός ή ο χαρακτήρας underscore
(το _), δηλαδή οτιδήποτε μπορεί να χρησιμοποιηθεί ως μέρος του ονόματος μιας μεταβλητής στην Perl. |
\W |
Οτιδήποτε εκτός από γράμμα, αριθμό ή underscore (ο χαρακτήρας αυτός αποτελεί το αντίθετο του \w) |
\d |
Οποιοδήποτε ψηφίο (0,1,2,3,4,5,6,7,8,9) |
\D |
Οτιδήποτε εκτός από ψηφίο (ο χαρακτήρας αυτός αποτελεί το αντίθετο του \d) |
\s |
Οποιοδήποτε σύμβολο κενού και συναφών στοιχείων (\n\t\f\r), δηλαδή κενό διάστημα, αλλαγή γραμμής (\n), tab (\t), formfeed (\f), carriage return (\r). |
\S |
Οτιδήποτε εκτός από σύμβολο κενού (ο χαρακτήρας αυτός αποτελεί το αντίθετο του \s) |
\b |
Λεκτικό σύνορο (word boundary) |
\B |
Οτιδήποτε εκτός από λεκτικό σύνορο |
^ |
Αρχή string |
$ |
Τέλος string |
| |
ή διαζευκτικό (ο λογικός χαρακτήρας εναλλαγής) |
[] |
Εναλλακτική χρήση του περιεχομένου (character class) |
. |
Οποιοσδήποτε χαρακτήρας |
? |
Μια ή καμία εμφάνιση του προηγούμενου χαρακτήρα |
* |
Καμία, μια ή περισσότερες εμφανίσεις του προηγούμενου χαρακτήρα |
+ |
Μια ή περισσότερες εμφανίσεις του προηγούμενου χαρακτήρα |
{} |
Αριθμός επαναλήψεων ενός χαρακτήρα |
Οι κυριότεροι τρόποι σύναξης pattern matching της Perl είναι οι ακόλουθοι:
Παράδειγμα |
Αναζήτηση για |
Σχόλια |
/gepiti/ |
gepiti |
Ό,τι ζητήθηκε. |
/gepiti/i |
Gepiti, gepiti, GEPITI, gePIti κ.λπ. |
Το i σημαίνει case insensitive. Θα βρεθούν λοιπόν τόσο κεφαλαία όσο και πεζά. |
/gepiti/g |
gepiti παντού |
Η αναζήτηση συνεχίζεται και μετά την εύρεση του πρώτου αποτελέσματος (θα εξηγηθεί παρακάτω με την while). |
/\bδημο/ |
δημοκρατία, δημογέροντας κ.λπ. |
Λόγω το \b θα αναζητηθούν μόνο strings που ξεκινούν μια λέξη |
/\bτρία\b/ |
Η λέξη τρία |
Δεν θα βρεθούν τα αλλοτρία, τρίαινα, πατρίας μια και βρίσκονται (ολόκληρα ή κατά ένα μέρος) μέσα σε λέξεις |
/\Bτρία\B/ |
Λέξεις όπως το πατρίας |
Δεν πρέπει να υπάρχει λεκτικό σύνορο πριν ή μετά το τρία. Θα βρεθούν λοιπόν μόνο strings όπου το τρία δεν αποτελεί αρχή ή τέλος λέξης. |
/^Αλ/ |
Αλλά, Αλλιώς κ.λπ. στην αρχή του προς αναζήτηση περιεχομένου |
Αν $something =~ /^Αλ/ τότε η αναζήτηση θα είναι επιτυχής μόνο αν το $something ξεκινάει από Αλ.
$something = Αλλιώς τα περιμέναμε (επιτυχής αναζήτηση) $something = Τίποτα. Αλλιώς πρέπει να γίνει (αποτυχία αφού το $something ξεκινάει με το «Τίποτα»). |
/ος$/ |
Γιώργος. Νίκος κ.λπ. στο τέλος του προς αναζήτηση περιεχομένου |
Αν $something =~ /ος$/ τότε η αναζήτηση θα είναι επιτυχής μόνο αν το $something τελειώνει σε ος (ή αν αναζητούμε στο $_ τότε θα πρέπει να τελειώνει σε ος ακολουθούμενο αμέσως μετά από αλλαγή γραμμής).
$something = /Το όνομά μου είναι Νίκος (επιτυχής αναζήτηση) $something = Το όνομά μου είναι Γιώργος. (αποτυχία αφού το $something τελειώνει με τελεία). |
/^/ |
Κάθε γραμμή που έχει αρχή |
Όλες οι γραμμές έχουν αρχή, συνεπώς κάθε γραμμή (π.χ. αν διαβάσουμε γραμμή γραμμή ένα αρχείο με τη while και την $_). |
/^5$/ |
5 |
Μια γραμμή που περιέχει μόνο τον χαρακτήρα 5. |
/^$/ |
’δεια γραμμή |
Μια γραμμή που περιέχει μόνο την αρχή και το τέλος της χωρίς τίποτε ενδιάμεσα. |
/Νίκος| Γιώργος/ |
Νίκος ή Γιώργος |
Π.χ. $something =~ /Νίκος|Γιώργος/ |
/(Νίκ|Γιώργ)ος/ |
Νίκος ή Γιώργος |
Εδώ εναλλάσσεται το περιεχόμενο των παρενθέσεων αντί για ολόκληρες τις λέξεις. |
/τ[οαη]/ |
το, τα, τη, τον, ταραμάς, αυτοκίνητο κ.λπ. |
Οτιδήποτε περιέχει τ ακολουθούμενο από ο ή α ή η. |
/58[$?]/ |
58$ ή 58? ή 58$$$ κ.λπ. |
Μέσα στις character classes οι ειδικοί χαρακτήρες δεν χρειάζονται escaping (προσθήκη του \ για την αποφυγή «κακής κατανόησης» από την Perl) με εξαίρεση τα ], - και το ^ αν βρίσκεται πρώτο. |
/[^78]/ |
Οτιδήποτε εκτός από 7 ή 8. |
Η ^ στην αρχή της character class δηλώνει άρνηση. H $something =~ /[^78]/ είναι αληθής όταν δεν περιέχεται πουθενά το 7 ή το 8. (Πρέπει όμως να υπάρχει κάτι άλλο. Αν η $something είναι κενή δεν έχουμε ταίριασμα.) |
/[a-z]1/ |
a1, b1, c12 κ.λπ. |
Η δηλώνει εύρος τιμών. Εδώ από το a έως και το z. |
/[0-9]a/ |
0a, 5ab κ.λπ. |
Εδώ το εύρος τιμών είναι από 0 έως και 9. |
/[0-9a-z]/ |
0, 1, 2, c, d, κ.λπ. |
Εδώ το εύρος τιμών είναι από 0 έως και 9 και από a έως και z. |
/25.00/ |
25100, 25a00, 25*00, 25,00 κ.λπ. |
Η τελεία αντιπροσωπεύει οποιονδήποτε χαρακτήρα. Αν θέλαμε να βρούμε το 25.00 θα έπρεπε να το γράψουμε /25\.00/ |
/^.$/ |
Οτιδήποτε αλλά μόνο ένα |
Μια γραμμή που μπορεί να περιέχει οποιονδήποτε χαρακτήρα, αλλά μόνον έναν. |
/σ?ταύρος/ |
σταύρος, ταύρος, παπασταύρος, μικροταύρος κ.λπ. |
Το σ μπορεί να υπάρχει μια φορά ή καθόλου. Αν είχαμε /στ?αύρος/ θα ταίριαζαν τα σαύρος, σταύρος, αλλά όχι το στταύρος γιατί πρέπει να έχουμε μόνο ένα ή κανένα τα μετά το σ. |
/ύαινα(κι)?/ |
ύαινα, υαινάκι κ.λπ. |
Το κείμενο στο οποίο αναφέρεται το ? μπορεί να μπει και μέσα σε παρένθεση. |
/αβ*γ/ |
αγ, αβγ, αββγ, αβββγ, αββββββγ, κ.λπ |
Το β μπορεί να επαναληφθεί άπειρες φορές. Μπορεί επίσης να μην υπάρχει καθόλου. |
/αβ+γ/ |
αβγ, αββγ, αβββγ, αββββββγ, κ.λπ |
Το β μπορεί να επαναληφθεί άπειρες φορές. Θα πρέπει όμως να υπάρχει τουλάχιστον μια (δεν γίνεται δεκτό το αγ). |
/\d{1,5}\$/ |
1$, 15$, 333$, 4896$, 15987$ κ.λπ. |
Ένα έως πέντε ψηφία (δηλαδή 0,1,2,3,4,5,6,7,8,9) ακολουθούμενα από το $. |
/\d{5}\$/ |
12345$, 98765$, 01234$ κ.λπ. |
Πέντε ψηφία (όχι περισσότερα ή λιγότερα) ακολουθούμενα από το $. |
/μαμα{3,} μου/ |
μαμααα μου, μαμαααααα μου κ.λπ. |
Ο προηγούμενος χαρακτήρας μπορεί να επαναλαμβάνεται 3 ή περισσότερες (οσεσδήποτε) φορές. Το «μαμαα μου» όμως δεν θα ταιριάξει (έχει μόνο δύο α μετά το μαμ). |
|
|
|
|
Τρέχουσα Ενότητα: Perl
|
|