Αν και υπάρχει ειδικό module για τη λήψη όλων των URLs μιας σελίδας (το HTML::LinkExtor), μερικές φορές προτιμούμε απλούστερες λύσεις είτε διότι τα modules δεν είναι πάντα διαθέσιμα στο σύστημα όπου εργαζόμαστε, είτε επειδή αυτό που θέλουμε να επιτύχουμε είναι αρκετά απλό και δεν υπάρχει λόγος να σκοτώνουμε τα ποντίκια με το κανόνι (small and simple is beautiful).
Στον κώδικα που ακολουθεί όλη η Web σελίδα βρίσκεται στην $content και επιθυμούμε να πάρουμε όλα τα URLs που ξεκινούν από ό,τι περιέχει η παράμετρος $start_url (π.χ. http://www.eeei.gr/interbiz).
while ($content =~ m/['"]($start_url(.*?))['"]/sig)
Η Perl θα βρει, δηλαδή θα κάνει match (m) ό,τι περικλείεται από τον χαρακτήρα ' ή " ['"], αρχίζει από $start_url και ακολουθείται από οτιδήποτε άλλο (.*?). Η αναζήτηση γίνεται γραμμή γραμμή (s) αν και αυτό δεν έχει σημασία αφού όλη η $content αποτελεί μια γραμμή, είναι case insensitive (i) και ισχύει για όλο το περιεχόμενο της $content, δηλαδή είναι global (g).
Για όσους έχουν απορία για το οτιδήποτε άλλο (.*?), αυτό μεταφράζεται ως ακολούθως:
. = οτιδήποτε (εκτός από αλλαγή γραμμής)
* = οσαδήποτε (από 0 έως όσο τύχει)
? = Σταμάτα στο πρώτο που θα βρεις
Για να καταλάβετε τη σημασία του ερωτηματικού δείτε την ακόλουθη περίπτωση:
<a href=http://www.eeei.gr/interbiz/articles/article1.htm"> ’ρθρο 1</a> μπλα μπλα μπλα μπλα μπλα μπλα μπλα μπλα μπλα μπλα μπλα μπλα μπλα μπλα μπλα <a href=http://www.eeei.gr/interbiz/articles/article2.htm"> ’ρθρο 2</a>
Στο (.*)['"] δηλαδή ταίριαξε ό,τι μπορείς μέχρι το ' ή " η Perl θα μας φέρει το:
http://www.eeei.gr/interbiz/articles/article1.htm> ’ρθρο 1</a> μπλα μπλα μπλα μπλα μπλα μπλα μπλα μπλα μπλα μπλα μπλα μπλα μπλα μπλα μπλα <a href=http://www.eeei.gr/interbiz/articles/article2.htm
Δηλαδή δεν θα σταματήσει στο πρώτο που θα συναντήσει, αλλά στο τελευταίο. Τότε λέμε ότι η αναζήτηση είναι greedy (αχόρταγη). Το ? της ζητάει να κάνει δίαιτα και να ικανοποιηθεί με το πρώτο " που θα συναντήσει, οπότε το αποτέλεσμα θα είναι:
http://www.eeei.gr/interbiz/articles/article1.htm
{
my $basic_url_to_get = $1;
Παίρνουμε το περιεχόμενο του (.*?)
my @url_to_get = ($site_begin, $basic_url_to_get);
Στις περισσότερες web σελίδες τα URLs δεν είναι πλήρη. Για παράδειγμα, αν η σελίδα:
http://www.eeei.gr/interbiz/index.htm
παραπέμπει στο
http://www.eeei.gr/interbiz/articles/article1.htm
τότε ο κώδικας συνήθως θα είναι απλώς:
<a href="articles/article1.htm">’ρθρο 1</a>
Aν λοιπόν η $start_url ήταν articles/ τότε το $basic_url_to_get θα έχει τις τιμές:
articles/article1.htm
articles/article2.htm
articles/article7.htm
articles/newarticle.htm
και ό,τι άλλο υπάρχει στη σελίδα. Αν εμείς θέλουμε το πλήρες URL τότε θα πρέπει αυτό να υπάρχει ήδη καταχωρημένο κάπου στο πρόγραμμά μας. Για παράδειγμα:
my $site_begin = http://www.eeei.gr/interbiz/
Δημιουργούμε λοιπόν την array @url_to_get που περιέχει τα $site_begin και $basic_url_to_get.
my $complete_url_to_get = join ('', @url_to_get);
Με την join ενώνουμε αυτά τα δύο σε μια scalar με διαχωριστικό τίποτε. Έτσι τώρα η $complete_url_to_get θα έχει τιμές όπως:
http://www.eeei.gr/interbiz/ articles/article2.htm