Τα πάντα για την Perl

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Τα πάντα για την Perl

Δημοσίευσηαπό medigeek » 27 Ιούλ 2011, 20:25

Με αφορμή αυτό το θέμα ανοίγω καινούριο θέμα ειδικά για την γλώσσα προγραμματισμού Perl.

Λίγα λόγια από την wikipedia:
http://el.wikipedia.org/wiki/Perl
έγραψε:Perl
Από τη Βικιπαίδεια, την ελεύθερη εγκυκλοπαίδεια

Η Perl είναι μία πολύ δημοφιλής αντικειμενοστρεφής γλώσσα προγραμματισμού. Συνήθως ένα πρόγραμμα σε Perl εκτελείται χρησιμοποιώντας άμεσα ή έμμεσα το διερμηνέα της γλώσσας. Αυτό που διακρίνει την Perl από πολλ́ες άλλες γλώσσες προγραμματισμού είναι το γεγονός ότι είναι διαθέσιμη για σχεδόν όλα τα λειτουργικά συστήματα. Η γλώσσα σχεδιάστηκε από τον Larry Wall και ο πηγαίος κώδικάς της διατίθεται βάση της αδείας ανοικτού κώδικα GPL. Η πρώτη έκδοση της γλώσσας εμφανίστηκε το 1987 ενώ στις αρχές του 2010 η πιο πρόσφατη έκδοσή της είναι η 5.10.1.


Συνέντευξη με τον δημιουργό της γλώσσας, Larry Wall: http://www.linuxjournal.com/article/3394

Μερικοί οδηγοί:
- Εξωτερικοί σύνδεσμοι
- http://perldoc.perl.org/index-tutorials.html
- http://perldoc.perl.org/index-faq.html

Βιβλία:
- http://www.perl.org/books/beginning-perl/
- http://books.perl.org/books

Θέματα σχετικά με perl στο forum:
viewtopic.php?t=15592
viewtopic.php?f=6&t=18564
viewtopic.php?f=41&t=14433&start=10

Πληροφορίες για την επερχόμενη καινούργια έκδοση της perl, perl 6:
- http://perlgeek.de/en/article/5-to-6
- "Larry Wall Speaks at Google" (αναφορά στην perl 6): http://www.youtube.com/watch?v=JzIWdJVP-wo
- Άλλες ομιλίες του larry wall: http://www.perlfoundation.org/perl6/ind ... ll_s_talks
Τελευταία επεξεργασία από medigeek και 28 Ιούλ 2011, 00:56, έχει επεξεργασθεί 2 φορά/ες συνολικά
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Re: Τα πάντα για την Perl

Δημοσίευσηαπό evolgen » 27 Ιούλ 2011, 21:39

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

Γνώσεις Linux: Μέτριο++ ┃ Προγραμματισμός: Perl, R, Python, SQL, C, Common Lisp, BashΑγγλικά: Άριστα

1. Ubuntu 14.04 trusty
2. Intel Core i7-3520M CPU @ 2.90GHz ‖ RAM 7892 MiB
3. Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
4. eth0: Broadcom NetXtreme BCM57765 Gigabit Ethernet PCIe [14e4:16b4] (rev 10) ⋮ eth1: Broadcom BCM4331 802.11a/b/g/n [14e4:4331] (rev 02)
Άβαταρ μέλους
evolgen
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1031
Εγγραφή: 28 Ιούλ 2010, 14:22
Τοποθεσία: UK
IRC: bioevolgenec
Εκτύπωση

Re: Τα πάντα για την Perl

Δημοσίευσηαπό medigeek » 27 Ιούλ 2011, 22:23

Ορίστε ένα παραδειγμα σε perl:
https://github.com/medigeek/various-scr ... mirrors.pl
Διαβάζει την ιστοσελίδα https://launchpad.net/ubuntu/+cdmirrors και δίνει.. διαφοτερικό αποτέλεσμα :)
Κώδικας: Επιλογή όλων
protocol="http" type="http" location="" link: http://ubuntu.cs.wisc.edu/pub/mirrors/linux/ubuntu/releases/
protocol="http" type="http" location="UZ" link: http://ubuntu.snet.uz/releases/
protocol="ftp" type="ftp" location="UZ" link: ftp://ubuntu.snet.uz/releases/
protocol="http" type="http" location="UZ" link: http://releases.ubuntu.uz/
protocol="http" type="http" location="" link: http://mirror-fpt-telecom.fpt.net/ubuntu-releases/
protocol="ftp" type="ftp" location="" link: ftp://mirror-fpt-telecom.fpt.net/ubuntu-releases/
protocol="http" type="http" location="VN" link: http://mirrors.digipower.vn/ubuntu/releases/
protocol="ftp" type="ftp" location="VN" link: ftp://mirrors.digipower.vn/ubuntu/releases/
protocol="rsync" type="rsync" location="VN" link: rsync://mirrors.digipower.vn/ubuntu/releases/
protocol="http" type="http" location="" link: http://zw.releases.ubuntu.com/
protocol="ftp" type="ftp" location="" link: ftp://zw.releases.ubuntu.com/
protocol="rsync" type="rsync" location="" link: rsync://zw.releases.ubuntu.com/ubuntu-release/


Και κάτι που δεν μπορούσα να κάνω με καμιά άλλη γλώσσα με τέτοια ευχέρεια:
https://github.com/medigeek/various-scr ... /grades.pl
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Re: Τα πάντα για την Perl

Δημοσίευσηαπό Dimitris » 27 Ιούλ 2011, 22:39

Εγώ προτείνω το βιβλίο "Higher order perl. Transforming programs with programs" του Mark Jason Dominus. Παρουσιάζει την perl ως μια functional programming language, με πάρα πολλά στοιχεία metaprogramming. Όποιος δεν αγαπάει τη lisp, μπορεί να εφαρμόσει τη δύναμη της lisp, χρησιμοποιώντας perl.
Άβαταρ μέλους
Dimitris
saintTUX
saintTUX
 
Δημοσιεύσεις: 1357
Εγγραφή: 13 Μάιος 2008, 13:57
Τοποθεσία: Θεσσαλονίκη
Εκτύπωση

Re: Τα πάντα για την Perl

Δημοσίευσηαπό medigeek » 28 Ιούλ 2011, 00:54

Ωραίο το βιβλίο, υπάρχει και ένας τύπος που έχει το pdf:
http://hop.perl.plover.com/
http://hop.perl.plover.com/book/
έγραψε:Higher-Order Perl is copyright ©2005 by Elsevier Inc. Unauthorized reproduction or distribution is absolutely forbidden.
In particular, note that although the text is available for free, Higher-Order Perl is not in the public domain and is not available under a free license of any sort. I distribute it from this web site by virtue of special permission from the publisher. You, most likely, do not have any such permission.


Κι αυτό είναι πολύ ωραίο βιβλίο: http://www.perl.org/books/beginning-perl/
Με κάνατε να θέλω πάλι να γράψω σε perl, τα one-liners μαγεύουν (και παράλληλα μπερδεύουν τους άλλους χεχε) :P
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Re: Τα πάντα για την Perl

Δημοσίευσηαπό evolgen » 08 Σεπ 2011, 21:43

Για να επαναφέρω το θέμα... :P

Σε τι επίπεδο βρισκόμαστε; Υπάρχουν άτομα που δεν ξέρουν καθόλου Perl και θέλουν σιγά σιγά να μάθουν; Θέλει κανείς βοήθεια με Perl ή κάποιος με μεγάλη εμπειρία να προτείνει ασκήσεις για εμάς τους νέοπες;

Συμβουλές και σχόλια ευπρόσδεκτα! :)
Το να μειώνεις ένα έργο ελεύθερου λογισμικού, επειδή θεωρείς το δικό σου καλύτερο,
είναι απαράδεκτη συμπεριφορά και δε συμβαδίζει με τις αρχές του ελεύθερου λογισμικού.

Γνώσεις Linux: Μέτριο++ ┃ Προγραμματισμός: Perl, R, Python, SQL, C, Common Lisp, BashΑγγλικά: Άριστα

1. Ubuntu 14.04 trusty
2. Intel Core i7-3520M CPU @ 2.90GHz ‖ RAM 7892 MiB
3. Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
4. eth0: Broadcom NetXtreme BCM57765 Gigabit Ethernet PCIe [14e4:16b4] (rev 10) ⋮ eth1: Broadcom BCM4331 802.11a/b/g/n [14e4:4331] (rev 02)
Άβαταρ μέλους
evolgen
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1031
Εγγραφή: 28 Ιούλ 2010, 14:22
Τοποθεσία: UK
IRC: bioevolgenec
Εκτύπωση

Re: Τα πάντα για την Perl

Δημοσίευσηαπό Dimitris » 08 Σεπ 2011, 23:38

Άσκηση 1η: Γράψτε μια συνάρτηση foo η οποία δέχεται ως όρισμα τον αριθμό n και επιστρέφει μια νέα συνάρτηση με όρισμα τον αριθμό i, και επιστρέφει τον n επαυξημένο (incremented στο πρωτότυπο) κατά i.

Φαντάζομαι είναι μια από τις κλασσικές ασκήσεις.

Συμβουλή: Προγραμματίστε στην perl σαν να γράφατε functional programming και όχι σαν να γράφατε C.

Άσκηση 2η: Υλοποίηση των python decorators σε perl. Τι είναι οι python decorators; Είναι συναρτήσεις οι οποίες εφαρμοζονται σε άλλες συναρτησεις και δίνουν μια νέα συνάρτηση. Για περισσότερες πληροφορίες δειτε εδώ http://www.python.org/dev/peps/pep-0318/
Η σύνταξη σε python είναι:
@dec
def foo(x):
# do something
είναι ισοδύναμη με:
foo = dec(foo)
Δηλαδή μια συνάρτηση dec δέχεται ως όρισμα μια άλλη συνάρτηση foo και επιστρέφει μια νέα συνάρτηση (πάλι foo) η οποία είναι κατά κάποιο τρόπο τροποποιημένη.

Άσκηση 3η: Γράψτε μια συνάρτηση που να λύνει (προσεγγιστικά) το πρόβλημα του περιπλανόμενου πωλητή http://en.wikipedia.org/wiki/Travelling ... an_problem

Αυτά προς το παρόν.
Άβαταρ μέλους
Dimitris
saintTUX
saintTUX
 
Δημοσιεύσεις: 1357
Εγγραφή: 13 Μάιος 2008, 13:57
Τοποθεσία: Θεσσαλονίκη
Εκτύπωση

Re: Τα πάντα για την Perl

Δημοσίευσηαπό evolgen » 09 Σεπ 2011, 00:20

Κατάφερα και πάλεψα το πρώτο, με αρκετή δυσκολία μιας και έχω απειροελάχιστη γνώση από functional programming και καλύτερη γνώση σε στυλ C.
Δεν ξέρω πόσο σωστό είναι, ωστόσο τη δουλειά του -φαίνεται να- την κάνει.
Spoiler: show
Κώδικας: Επιλογή όλων
#!/usr/bin/perl -w

(@ARGV == 2) or die "Usage: ./ex1.pl number1 number2";
my $n = $ARGV[0];
my $i = $ARGV[1];

foo($n);
print '$n: ' . "\t " . $n . "\n";
print '$i: ' . "\t+" . $i . "\n";
print "Result:" . "\t " . $res. "\n";

sub foo
{
$p = $_[0];
foo2($i);
}

sub foo2
{
$res = $p + $_[0];
return($res);
}


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

Γνώσεις Linux: Μέτριο++ ┃ Προγραμματισμός: Perl, R, Python, SQL, C, Common Lisp, BashΑγγλικά: Άριστα

1. Ubuntu 14.04 trusty
2. Intel Core i7-3520M CPU @ 2.90GHz ‖ RAM 7892 MiB
3. Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
4. eth0: Broadcom NetXtreme BCM57765 Gigabit Ethernet PCIe [14e4:16b4] (rev 10) ⋮ eth1: Broadcom BCM4331 802.11a/b/g/n [14e4:4331] (rev 02)
Άβαταρ μέλους
evolgen
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1031
Εγγραφή: 28 Ιούλ 2010, 14:22
Τοποθεσία: UK
IRC: bioevolgenec
Εκτύπωση

Re: Τα πάντα για την Perl

Δημοσίευσηαπό Dimitris » 09 Σεπ 2011, 10:38

Η foo δεν επιστρέφει συνάρτηση, αλλά το αποτέλεσμα της foo2. Για να σε βοηθήσω θα δώσω ένα άλλο πολύ πιο απλό παραδειγμα. Στην perl μπορείς να γράψεις αυτό:
Κώδικας: Επιλογή όλων
$print_hello = sub {
print "Hello, world! " . $_[0] ."\n"};

$print_hello->(2);

Η μεταβλητή $print_hello είναι ουσιαστικά μια συνάρτηση και πρέπει να την αποαναφέρουμε (dereference) για να την καλέσουμε.

Τώρα αυτό μπορούμε να το κάνουμε συνάρτηση ως εξής:
Κώδικας: Επιλογή όλων
sub print_hello_generator {
return sub { print "Hello, world!\n"; }
}

my $print_hello = print_hello_generator();
$print_hello->();

Δημιουργήσαμε δηλαδή μια γεννήτρια συναρτήσεων, η οποία επιστρέφει συναρτήσεις οι οποίες με τη σειρά τους μπορούμε τις καλέσουμε αν τις αποαναφέρουμε (dereference).

Τώρα μπορούμε να βγάλουμε το μήνυμα εκτός της γεννήτριας:
Κώδικας: Επιλογή όλων
sub print_hello_generator_2 {
my $message = "Hello, world!\n";
return sub { print $message; }
}

my $print_hello_2 = print_hello_generator_2();
$print_hello_2->();


Αυτό που μόλις υλοποιήσαμε είναι ένα closure. H μεταβλητή $message, αν θα μπορούσα να την περιγράψω σε C έννοιες, είναι μια static μεταβλητή της συνάρτησης print_hello, η οποία όμως print_hello δημιουργήθηκε δυναμικά. (κάτι τέτοιο δεν είναι δυνατό στη C)

Τώρα με αυτή τη γνώση προσπάθησε να δημιουργήσεις μια συνάρτηση (βλ. άσκηση 1) η οποία θα έχει το εξής αποτέλεσμα:
Κώδικας: Επιλογή όλων
$bla = foo(1);

$bla->(1); # επιστρέφει 2, δηλαδή 1+1
$bla->(1); # επιστρέφει 3, δηλαδή (1+1)+1

$bla = foo(1);

$bla->(2); # επιστρέφει 3, δηλαδή 1+2
$bla->(3); # επιστρέφει 6, δηλαδή (1+2)+3


Δεν είναι φανταστικές οι δυνατότητες τις perl;
Άβαταρ μέλους
Dimitris
saintTUX
saintTUX
 
Δημοσιεύσεις: 1357
Εγγραφή: 13 Μάιος 2008, 13:57
Τοποθεσία: Θεσσαλονίκη
Εκτύπωση

Re: Τα πάντα για την Perl

Δημοσίευσηαπό Ilias95 » 28 Νοέμ 2011, 18:36

Perl δεν γνωρίζω καθόλου.
Έχω την παρακάτω εντολή με την οποία παίρνω τον αριθμό των frames ενός video:
Κώδικας: Επιλογή όλων
ffmpeg -i video.avi -vcodec copy -f rawvideo -y /dev/null 2>&1 | tr "^M" '\n' | grep '^frame=' | perl -pe 's/^frame=\s*([0-9]+)\s.*$/\1/' | tail -n 1

Θέλω το κομμάτι της perl να το μεταφράσω σε python ή bash.
Μπορεί να μου εξηγήσει κάποιος τι ακριβώς "κάνει" ο perl κώδικας;
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Επόμενο

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι

cron