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

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

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

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

Δημοσίευσηαπό medigeek » 28 Νοέμ 2011, 19:42

Καλωσόρισες στον απίθανο κόσμο των regular expressions :)

tr "^M" '\n' - Μετατρέπει κάποιο χαρακτήρα (^M ; ) σε new line. Βασικά σπάει το output σε γραμμές.
grep '^frame=' - Χρησιμοποιεί Regular expressions - Επιλέγει μόνο τις γραμμές που αρχίζουν (^) με: frame=
perl -pe 's/^frame=\s*([0-9]+)\s.*$/\1/' - Το 's/X/Y/' στην perl μετατρέπει κάποιο output X σε Υ, με τη βοήθεια regular expressions. To \1 αντιστοιχεί με το [0-9]+ στην παρένθεση.

Με άλλα λόγια, κόβει το output σε γραμμές και επιλέγει τη γραμμή που αρχίζει με "frame=". Διαγράφει ό,τι βρίσκεται στη γραμμή, και εμφανίζει μόνο τον αριθμό των frames.

Το perl κομμάτι δεν νομίζω ότι είναι δύσκολο:
http://docs.python.org/library/re.html
http://docs.python.org/library/re.html#re.sub

Κώδικας: Επιλογή όλων
import re
re.sub( r'^frame=\s*([0-9]+)\s.*$', r'\1', 'frame=2009 blablabla')


Υποθέτω πως μπορεί να γίνει το αντίστοιχο με την εντολή sed ή με το awk για bash, αν και.. θέλει λίγη σκέψη. :)
Κύπριος; Κόπιασε στο 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

Δημοσίευσηαπό medigeek » 28 Νοέμ 2011, 19:55

Με sed αυτό θα πρέπει να δουλέψει:
έγραψε:sed -re 's#^frame=\s*([0-9]+)\s.*$#\1#'


Κώδικας: Επιλογή όλων
ffmpeg -i video.avi -vcodec copy -f rawvideo -y /dev/null 2>&1 | tr "^M" '\n' | grep '^frame=' | sed -re 's#^frame=\s*([0-9]+)\s.*$#\1#' | tail -n 1
Κύπριος; Κόπιασε στο 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

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

medigeek έγραψε:Καλωσόρισες στον απίθανο κόσμο των regular expressions :)

Ωχ! Είχα ασχοληθεί κάποια στιγμή και τις είχα καταλάβει ως ένα βαθμό από το http://diveintopython3.ep.io/regular-expressions.html αλλά αυτό που μου είχε μείνει περισσότερο ήταν:
Jamie Zawinski έγραψε:Some people, when confronted with a problem, think “I know, I’ll use regular expressions.” Now they have two problems.

:lol:

Ψιλοκατάλαβα τι ακριβώς γίνεται, αλλά θα προτιμήσω να το κάνω σε bash τελικά.
Αυτό που έγραψες με τη sed δουλεύει περίφημα! Το βρήκα και με awk όπως είπες επίσης:
Κώδικας: Επιλογή όλων
ffmpeg -i video.avi -vcodec copy -f rawvideo -y /dev/null 2>&1 | tr "^M" '\n' | awk '/^frame=/ {print $2}'| tail -n 1

Off topic:
Τα tr, sed, awk και tail υπάρχουν by default σε κάθε διανομή Linux;
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

Δημοσίευσηαπό medigeek » 28 Νοέμ 2011, 21:01

Ilias95 έγραψε:Τα tr, sed, awk και tail υπάρχουν by default σε κάθε διανομή Linux;

Το tr είναι μέρος του coreutils. Για sed ή awk δεν γνωρίζω, συνήθως συνυπάρχουν. Μπορείς να χρησιμοποιήσεις και τα δύο. Αν δεν υπάρχει το sed, χρησιμοποίησε το awk. :)

Κώδικας: Επιλογή όλων
if [ -f `which sed` ]; then sed=1; fi
if [ -f `which awk` ]; then awk=1; fi
Κύπριος; Κόπιασε στο 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

Δημοσίευσηαπό Ilias95 » 29 Νοέμ 2011, 20:32

Off topic:
@medigeek
Τελικά το έκανα μόνο με python χάρη στην re.sub() που μου έδωσες:
Κώδικας: Επιλογή όλων
import subprocess, shlex, re

def number_of_frames(_file):
cmd = "ffmpeg -i {0} -vcodec copy -f rawvideo -y /dev/null".format(_file)
exec_cmd = subprocess.Popen(shlex.split(cmd), stderr=subprocess.PIPE)
for i in exec_cmd.stderr.read().split('\n'):
if 'frame=' in i:
frames = re.sub( r'^frame=\s*([0-9]+)\s.*$', r'\1', i)
return frames

Ευχαριστώ για τη βοήθεια.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

Δημοσίευσηαπό medigeek » 29 Νοέμ 2011, 21:37

Πολύ ωραίος ο τρόπος που χειριστηκες το subprocess με τα pipes :)
Κύπριος; Κόπιασε στο 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

Δημοσίευσηαπό migf1 » 03 Δεκ 2011, 15:57

Dimitris έγραψε:
...
Αυτό που μόλις υλοποιήσαμε είναι ένα 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;


Κώδικας: Επιλογή όλων

#include <stdio.h>
/* ------------------------ */
int ifoo( int i )
{
return i+1;

}
/* ------------------------ */
int nfoo( int n )
{
return ifoo(n);
}
/* ------------------------ */
int main( void )
{
int n = 2;
int (*bla)(int) = &nfoo;

printf("bla(%d) = %d\n", n, bla(n) );

return 0;
}

Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 03 Δεκ 2011, 16:19

Χμ, μάλλον άλλο κατάλαβα :( το θέμα είναι πως είναι καθόλα εφικτό και στη C (θα το κοιτάξω όταν πάω σπίτι με καθαρό μυαλό. γιατί προφανώς δεν κατάλαβα την εκφώνηση).
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 03 Δεκ 2011, 17:32

migf1 έγραψε:Χμ, μάλλον άλλο κατάλαβα :( το θέμα είναι πως είναι καθόλα εφικτό και στη C (θα το κοιτάξω όταν πάω σπίτι με καθαρό μυαλό. γιατί προφανώς δεν κατάλαβα την εκφώνηση).


Φεύγω για σπίτι!

Έτσι γίνεται με C: http://www.hokstad.com/how-to-implement-closures.html (αν δεν βαρεθώ μπορεί αργότερα ή αύριο να το προσαρμόσω στα μέτρα της συγκεκριμένης άσκησης... η ουσία είναι πως μπορείς να διαχειριστείς run-time μέσω function pointers.

Αυτό που κάνουν δηλαδή behind the scenes και οι περισσότερες HL γλώσσες και απλά το δίνουν έτοιμο στο εξωτερικό interface, έτοιμο προς χρήση... στη C μπορείς να το φτιάξεις μια φορά και να το κάνεις βιβλιοθηκούλα για να υπάρχει πλέον κι αυτό έτοιμο για μελλοντική χρήση ... ή εναλλακτικά να χρησιμοποιήσεις κάποιο έτοιμο library ή compiler specific extensions (ο gcc για παράδειγμα υποστηρίζει εδώ και πολλά χρόνια closures, nested functions, κλπ ως extensions ).

EDIT:
Να κι ένα σχετικό αποτέλεσμα από ένα γρήγορο googling: http://linuxgazette.net/112/ramankutty.html (ενδέχεται να έχει και τη λύση της άσκησης μέσα σε C... δεν το διάβασα γιατί φεύγω)
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό h12 » 03 Δεκ 2011, 18:06

τα σπάει η περλ .. :))
1 Γνώσεις Linux: Ικανοποιητικό ┃ Προγραμματισμού: Καθόλου ┃ Αγγλικών: Ικανοποιητικό
2 Lubuntu 12.10 «64bit» | On dual boot alongside Windows 7 (pre-installed)..
3 Intel Core i3-2350M CPU @ 2.30GHz ‖ RAM 3839 MiB ‖ ASUSTeK COMPUTER INC. X501A (Laptop) ..
4 Intel 2nd Generation Core Processor Family Integrated Graphics Controller [8086:0116] (rev 09)
5 eth0: Realtek RTL8111/8168B PCI Express Gigabit Ethernet controller [10ec:8168] (rev 0a) ⋮ wlan0: Ralink RT5390 Wireless 802.11n 1T/1R PCIe [1814:5390]
h12
punkTUX
punkTUX
 
Δημοσιεύσεις: 268
Εγγραφή: 06 Μαρ 2011, 13:39
Εκτύπωση

ΠροηγούμενηΕπόμενο

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

cron