[eeei.gr Logo]
Επικοινωνία
Ταυτότητα
Μαθήματα Internet | Μαθήματα Προγραμματισμού | Net Business | Τα νέα του Internet | Ο Κόσμος του Αύριο

Συναρτήσεις της Perl

Η Perl διαθέτει έναν μεγάλο αριθμό από συναρτήσεις. Συναντήσαμε ήδη τις print, chomp, printf, sprintf, keys και values. Εδώ θα αναφέρουμε μερικές ακόμη.

Δυστυχώς όλες είναι πάρα πολλές για να τις παρουσιάσω όλες εδώ, έτσι περιορίζομαι στις σημαντικότερες λειτουργίες όσων συναρτήσεων θεωρώ εγώ πιο χρήσιμες. Για περισσότερες πληροφορίες διαβάστε ένα καλό βιβλίο για Perl.

Μαθηματικές Συναρτήσεις:

Abs

Μας δίνει την απόλυτη τιμή.

my $a = -5;

my $b = abs ($a);

Έτσι $b = 5

Rand και Int

Η Rand μας δίνει έναν ψευδοτυχαίο δεκαδικό αριθμό μεταξύ του 0 και του 1 (ο αριθμός μπορεί να πάρει την τιμή 0 αλλά όχι την τιμή 1).

my $c = rand;

print "c = $c\n";

Η τιμή που έλαβα εγώ ήταν 0,668212890625

my $d = rand 5;

print "d = $d\n";

Αν συνοδεύσουμε την rand με μια τιμή (π.χ. εδώ το 5) τότε ο τυχαίος αριθμός θα είναι μεγαλύτερος ή ίσος με το μηδέν, αλλά μικρότερος από την τιμή που δώσαμε (δηλαδή εδώ από το 5). Πράγματι η τιμή που έλαβα εγώ τρέχοντας αυτό το πρόγραμμα ήταν 4,65286254882813

Αν επιθυμούμε ο τυχαίος αριθμός μας να είναι ακέραιος, θα συνδυάσουμε τη rand με την int (integer) που μετατρέπει τους αριθμούς σε ακέραιους.

my $e = int(rand 5) +1;

print "e = $e\n";

Αυτό θα μας δώσει μια τιμή μεταξύ του 1 και του 5, ενώ το $e = int(rand 5) θα μας έδινε τιμή μεταξύ του 0 και του 4.

Η int μετατρέπει έναν αριθμό σε ακέραιο απαλείφοντας τα δεκαδικά ψηφία. Για παράδειγμα:

my $a = 5,99999999;

my $b = int ($a);

print "b = $b\n";

Το $b θα είναι ίσο με 5 και όχι με 6 όπως θα περίμενε κανείς βασισμένος στους κανόνες στρογγυλοποιήσεως. Για στρογγυλοποιήσεις χρησιμοποιήστε τη sprintf.

sqrt (τετραγωνική ρίζα)

my $a = '16';

my $b = sqrt($a);

print "b = $b\n";

Μας δίνει b = 4.

Συναρτήσεις διαχείρισης strings:

lc

Μετατροπή κεφαλαίων σε πεζά (μικρά).

my $a = 'ABCDEF';

my $b = lc($a);

print "b = $b\n";

Μας δίνει: b = abcdef

lcfirst

my $a = 'ABCDEFG HIJKL';

my $b = lcfirst($a);

print "b = $b\n";

Μας δίνει: b = aBCDEFG HIJKL

uc - ucfirst

Μετατροπή όλων (ή μόνο του πρώτου χαρακτήρα) από πεζά σε κεφαλαία.

my $a = 'abcde fgh';

my $b = uc ($a);

my $c = ucfirst($a);

print "b = $b, c = $c\n";

Μας δίνει: b = ABCDE FGH και c = Abcde fgh

Reverse

Με αυτή τη συνάρτηση μπορούμε να αντιστρέψουμε τα περιεχόμενα μιας scalar ή μιας array:

my @test_array = (0, 12, 5, 'a', 9, 'z');

my @antistrofi = reverse @test_array;

print "@antistrofi \n";

Το αποτέλεσμα είναι:

z 9 a 5 12 0

my $test = "abcd123456789";

my $anapoda = reverse $test;

print "$anapoda \n";

Το αποτέλεσμα είναι:

987654321dcba

Map

Η map παίρνει τα περιεχόμενα μιας λίστας, τα τροποποιεί και τοποθετεί σε μια νέα λίστα το αποτέλεσμα της τροποποίησης κάθε ενός από αυτά. Για παράδειγμα:

my @test_array = (0, 12, 5, 18 , 9, 1966);

my @diplasia = map {$_*2} @test_array;

print "@diplasia \n";

Μας δίνει:

0 24 10 36 18 3932

Η map μπορεί να δεχθεί μέσα της ολόκληρα blocks εντολών. Για παράδειγμα:

my @test_array = (0, 12, 5, 18 , 9, 1966);

my @diaforetiki = map

{

if ($_<6) {}

elsif ($_ > 8 and $_ <16) {$_}

else {$_*3}

} @test_array;

print "@diaforetiki \n";

Το αποτέλεσμα είναι:

12 54 9 5898

Προσέξτε ότι οι τιμές που ήταν μικρότερες από 6 δεν συμπεριελήφθησαν στη νέα array (@diaforetiki) αφού είπαμε στη map να μην κάνει τίποτε ({}). Η map λοιπόν μπορεί να χρησιμοποιηθεί και για φιλτράρισμα των περιεχομένων μιας array και δημιουργία καινούριας με βάση κάποια κριτήρια.

Σημειώνουμε ότι το {$_} σημαίνει πως η τιμή πρέπει να παραμείνει αμετάβλητη, ενώ το {$_*3} πολλαπλασιάζει την τιμή του στοιχείου της λίστας με το 3.

Lenth

Με τη συνάρτηση αυτή βρίσκουμε τον αριθμό των χαρακτήρων μιας scalar. Για παράδειγμα:

my $test = 'abcdefghig';

my $how_many = length ($test);

print "Number of characters : $how_many\n";

Η εκτύπωση θα μας δώσει:

Number of characters : 10

Μέσα στους χαρακτήρες περιλαμβάνονται και τα κενά. Το my $test = 'abcde fghig' λοιπόν έχει μήκος 11 χαρακτήρες.

Time

Η συνάρτηση αυτή μας δίνει τον αριθμό των δευτερολέπτων που έχουν περάσει από την 'epoch' (συνήθως την 1/1/1970 UTC). Επειδή μπορεί να διαφέρει από ένα λειτουργικό σύστημα σε ένα άλλο, χρησιμοποιείται συνήθως για να μετρήσουμε τον χρόνο που διήρκεσε μια εργασία. Για παράδειγμα:

my $start_time = time();

… κάποιες εργασίες

my $end_time = time();

my $duration = $end_time - $start_time;

Αφαιρόντας τη $start_time από την $end_time έχουμε τον χρόνο που διήρκεσαν οι εργασίες μας (σε δευτερόλεπτα).

localtime

Η συνάρτηση αυτή μας δίνει την τρέχουσα χρονική στιγμή (διορθωμένη κατά την τοπική ώρα). Για παράδειγμα το:

my $test = localtime (time());

μου έδωσε:

Wed Jun 19 11:01:01 2002

Δηλαδή το παράδειγμα αυτό έτρεξε την Τετάρτη 19 Ιουνίου 2002 στις 11:01:01.

Συνήθως τη localtime τη χρησιμοποιούμε σε list και όχι σε scalar μορφή όπως κάναμε παραπάνω. Στο παράδειγμα που ακολουθεί όλες οι πληροφορίες αποτελούν στοιχεία μιας array.

my @test = localtime (time());

Εδώ το αποτέλεσμα μιας εκτύπωσης είναι:

25 3 11 19 5 102 3 169 1

Στην παραπάνω τη λίστα:

  • Το [0] είναι τα δευτερόλεπτα (εδώ 25)
  • Το [1] είναι τα λεπτά (εδώ 3)
  • Το [2] είναι οι ώρες (εδώ 11)
  • Το [3] είναι οι ημέρες (εδώ η 19η του μήνα)
  • Το [4] είναι οι μήνες (εδώ ο 5). Οι μήνες μετρούν από το 0 έως το 11. Ο 5 λοιπόν είναι ο έκτος μήνας, δηλαδή ο Ιούνιος.
  • Το [5] είναι ο χρόνος (εδώ το 102). Τα χρόνια αρχίζουν να μετρούν από το 1900. Το 2002 λοιπόν είναι το 102.
  • Το [6] είναι η ημέρα της εβδομάδας. Οι ημέρες μετρούν από το 0 έως το 6. Η Τετάρτη λοιπόν είναι 3. (Η Κυριακή είναι 0 και το Σάββατο 6.)
  • Το [7] είναι ο αύξων αριθός της ημέρας από την αρχή του χρόνου. Η 19/6/2002 (σήμερα που γράφω αυτό το κείμενο) είναι η 170η ημέρα του χρόνου. Έχουν περάσει δηλαδή 169 ολόκληρες ημέρες.
  • Το [8] είναι το daylight savings time.

scalar

Υποχρεώνει μια array να συμπεριφερθεί ως scalar. Για παράδειγμα:

my @test = (15, 25, 3);

print scalar (@test);

Η print θα διαχειριστεί την @test ως μια scalar και θα μας δώσει τον αριθμό των στοιχείων της. Η λειτουργία εδώ είναι αντίστοιχη του

my @test = (15, 25, 3);

my $test1 = @test;

print "$test1";

Στην περίπτωση της localtime που αναφέρθηκε παραπάνω θα έχουμε:

my $current_time = scalar localtime;

print "$current_time\n";

Εδώ η $current_time λαμβάνει τη scalar μορφή της localtime δηλαδή Wed Jun 19 14:29:32 2002

Index

Μας δίνει τη θέση ενός string μέσα σε ένα άλλο. Για παράδειγμα:

my $big_string = "After more than two long years of hard work, the perl5-porters is proud to announce Perl 5.8.0. The most important new features are enhanced Unicode and threads support, and the new I/O subsystem called PerlIO, but there are lots of new goodies, not to mention bazillion bug fixes. The full announcement is available, and you can read what is new in 5.8.0, and if you like what you see, start installing. Since this release has extensive support for non-Latin scripts, we also translated the announcement to Traditional Chinese (Big5-ETEN), Simplified Chinese (EUC-CN or GB2312), Japanese (EUC-JP), and Korean (EUC-KR) (by Autrijus Tang, Dan Kogai, and Jungshik Shin).';

my $search_string = 'Latin';

my $position = index($big_string, $search_string);

print "$position\n";

Εδώ ψάχνουμε για το string Latin μέσα στη $big_string. Η τιμή που θα μας δώσει η εκτύπωση είναι 458. Η index είναι case sensitive. Αν ψάξουμε για το latin η τιμή θα είναι -1 (δεν το βρήκε και επειδή ξεκίνησε από αρχική τιμή θέσης 0 αφαίρεσε μια μονάδα και μας έδωσε -1).

Substr

Η συνάρτηση αυτή χρησιμοποιείται για να λάβουμε το τμήμα ενός string που βρίσκεται μεταξύ συγκεκριμένων θέσεων. Η πιο συνηθισμένη σύνταξή της είναι:

Substr ( το string από το οποίο θα λάβουμε ένα τμήμα, θέση αρχής, μέγεθος τμήματος)

Για παράδειγμα:

my $big_string = 'Προχωράς προς το σπίτι του αγοριού/κοπελιάς σου. Υπάρχουν δυο δρόμοι για να πας εκεί. Ο ένας είναι ένας ίσιος δρόμος που σε πάει εκεί γρήγορα,

αλλα είναι συνηθισμένος και βαρετός. Ο άλλος είναι ένας με αρκετές στροφές

και γεμάτος με αξιοθέατα στη διαδρομή, αλλα αργείς λίγο για να φτάσεις στο

σπίτι του/της αγαπημένου/αγαπημένης σου';

my $new_string= substr ($big_string, 171, 7);

print "$new_string\n";

Εδώ λαμβάνουμε τους χαρακτήρες που βρίσκονται στις θέσεις 171 '177, δηλαδή τη λέξη βαρετός (όπως και στην index η θέση δεν συμπίπτει ακριβώς με τον αριθμό των χαρακτήρων + τα κενά γιατί πιθανώς να υπάρχουν και άλλοι «αφανείς» χαρακτήρες όπως οι αλλαγές γραμμών). Η πρώτη θέση έχει την τιμή 0 άρα αν θέλουμε την αρχή του string θα δηλώσουμε ως θέση εκκίνησης το 0. Αν δηλώσουμε αρνητική θέση εκκίνησης τότε η substr θα λειτουργήσει ανάποδα. Θα αφήσει τόσους χαρακτήρες από το τέλος και μετά θα λάβει τον αριθμό των χαρακτήρων που θέλουμε. Για παράδειγμα, στο παραπάνω string:

my $new_string= substr ($big_string, -20, 7);

Μας δίνει: μένου/α

Επιστροφή στην Κορυφή

Η συνάρτηση exists (διαγραφή διπλοτύπων)

Η συνάρτηση αυτή χρησιμοποιείται για να μας δείξει αν υπάρχει ή όχι ένα key μιας hash. Για παράδειγμα:

my %info = (height => 185, weight => 87);

my @info2 = (85,25,33);

if (exists $info{height})

{

print "\$info\{height\} exists\n";

}

else

{

print "\$info\{height\} does not exist\n";

}

if (exists $info2[3])

{

print "\$info[3] exists\n";

}

else

{

print "\$info[3] does not exist\n";

}

Εδώ η εκτύπωση θα δώσει:

$info{height} exists

$info[3] does not exist

Το $info{height} υπάρχει ενώ το $info[3] όχι.

Προσοχή! Η exists ελέγχει μόνο αν υπάρχει το στοιχείο, όχι αν η τιμή του είναι αληθής ή αν είναι defined (ένα στοιχείο μπορεί να υπάρχει και με ψευδή τιμή ή να βρίσκεται σε undefined κατάσταση).

Η συνάρτηση exists χρησιμοποιήται συχνά για τη διαγραφή διπλοτύπων ή την καταμέτρηση τιμών. Για παράδειγμα:

my %repetitions;

Δημιουργούμε μια hash για να τοποθετήσουμε το τελικό αποτέλεσμα των ενεργειών μας.

my @test = qw(Giorgos Nikos Matina Giorgos Giorgos Nikos Mixalis);

Αυτή είναι η λίστα με τα δεδομένα μας (χρησιμοποίησα το qw για να γλιτώσω την πληκτρολόγηση κομάτων και αποστρόφων). Θέλουμε να βρούμε πόσες φορές υπάρχει το καθένα και να καθαρίσουμε τη λίστα από τα διπλότυπα.

foreach my $element (@test)

Για κάθε στοιχείο της @test.

{

if (exists $repetitions{$element})

Αν υπάρχει ως key μέσα στην hash

{

$repetitions{$element}++;

}

αύξησε την τιμή του κατά μια μονάδα.

else

{

$repetitions {$element} = 1;

}

}

Διαφορετικά, βάλε το μέσα στην hash και δώσε του ως τιμή το 1.

Το

print %repetitions;

θα μας δώσει:

Mixalis1Nikos2Matina1Giorgos3

Οι τιμές (values) της hash μας δίνουν τον αριθμό των επαναλήψεων, ενώ τα keys της hash μας δίνουν τις μοναδικές τιμές της @test.


Τρέχουσα Ενότητα: Perl


 

Φιλικά - συνεργαζόμενα sites: Left Handed Products


© Eeei.gr 2009