פרק 7: מודולים

[הקודם : טיפול בקבצים][חזרה לתוכן העניינים][הבא : אינטרנט]

7.1 כללי

עד עכשיו השתמשנו ביכולות הבנויות של פרל. אחלה יכולות, אבל מה הלאה?
כדי להרחיב את היכולות של פרל, משתמשים במודולים. מודולים הם קבצי פרל, שאתה מוסיף לתוכנית שלך. זה כמו ה-include של C. מישהו כבר ישב וכתב קוד המטפל בפעולות מסובכות. לא צריך להמציא את הגלגל מחדש בכל פעם. (למרות שזה כיף)
קיימים אלפי מודולים עבור פרל. מודולים עבור תקשורת מול מסדי נתונים, מודולים עבור תקשורת מול האינטרנט, מודולים לניתוח קבצים, מודולים עבור מבני נתונים מסובכים. תבחר נושא, ובטח יש בשבילו מודול. כל המודולים נכתבו ע"י אנשים פרטיים, ולכן קיימים מודולים עם באגים, קיימים מודולים בהם המחבר נעלם, אבל רובם תקינים, והמחברים בד"כ מתקנים את הבאגים, אם וכאשר נמצאים כאלה. אז כנס לאתר
search.CPAN.org, ותרגיש חופשי למצוא מודול שעושה בדיוק את מה שאתה צריך.

7.2 שימוש במודולים

כדי להשתמש במודול, תשתמש בפקודה use. ככה:

use LWP::Simple;

כאן אני מבקש מהקומפילר שיחבר לתוכנית מודול. המודול הספציפי הזה הוא לגישה לדפים באינטרנט. בתוך המודול כתוב איזה פונקציות ואילו משתנים הוא ייתן לי. למשל, המודול הזה נותן פונקציה הנקראת בפשטות get, שמקבל URL, ומחזירה את הדף שבאותו מיקום.

$content = get("http://www.google.com/");

אחרי הפקודה הזאת, בתוך $content יהיה כל הדף הראשי של גוגל.

כאשר עושים use כמו למעלה, אזי המודול נותן לך איזה פונקציות שהוא רוצה. אבל יש פונקציות שהוא ייתן לך רק אם תבקש במיוחד:

use LWP::Simple qw{$ui};

כאן אתה אומר לו, אני יודע שיש לך בפנים את $ui, תן לי אותו!

7.3 מודולים כאובייקטים

אין בפרל אובייקטים אמיתיים. במקום זה, משתמשים במודולים בתור אובייקטים. לדוגמא:

use FileHandle;

זהו מודול שנותן גישה נוחה יותר לקבצים מאשר האופציות הפנימיות של פרל. (במיוחד אם אתה משתמש בכמה קבצים בו זמנית) כדי להגדיר באמצעותו מחזיק-קובץ, עושים:

$fh=new FileHandle;

ואז, כדי לפתוח את הקובץ:

$fh->open("> tmp.txt");

או פשוט:

$fh=new FileHandle("> tmp.txt");

שים לב רגע להבדל בין מודולים רגילים למודולים אובייקטים. מודולים רגילים מוסיפים לך עוד פונקציות לסביבת ההרצה, כמו בדוגמא שבסעיף הקודם. לפני שקראנו למודול לא היתה פקודת get, ואילו עכשיו יש. לעומת זאת, מודולים שהם אובייקטים לא מוסיפים לך פונקציות, אלא מחכים שתעשה להם new ודרך האובייקט תעבוד. כמובן, יש מודולים שעובדים בשני הדרכים, גם מוסיפים פונקציות וגם עובדים כמו אובייקט, אבל זו זכותם...

7.4 מודולים פופולריים

יש בעיות נפוצות יותר, ויש בעיות נפוצות פחות. בהתאם, יש מודולים שכולם משתמשים, ויש מודולים שבאים לתת מענה לבעיה ספציפית נידחת. הבאתי פה רשימה של המודולים היותר פופולריים, בהנחה שתזדקק להם בשלב זה או אחר.
תיאורשם מודול
גישה לאינטרנט (בפרוטוקול http)LWP::Simple
גישה למסדי נתוניםDbi
גישה לתיבת הדואר (על יוניקס)Mail::Box
כתיבת תוכניות CGICGI
גישה נוחה לקבציםFileHandle
גישה למשתני הסביבהEnv
מידע על איך פרל קומפלהConfig

7.5 תוכניות דוגמא

#!/usr/bin/perl -w 
use strict; 
use FileHandle; 
my $handle = new FileHandle; 
$handle->open("+> output") or die "File won't open!\n"; 
$handle->print("A line in the river\n"); 
print $handle "And a line under the river\n"; 
seek($handle, 0, 0); 
print "I printed: ", <$handle>; 
$handle->close();

זוהי תוכנית המשתמש במודול FileHandle. אפשר לראות שמשתמשים במשתנה $handle גם בתור מחזיק קובץ רגיל, וגם כמו אובייקט. (כמו שאפשר לראות בשתי ההדפסות)
עוד הערה, זה אנחנו פותחים את הקובץ באמצעות סימון מיוחד, '<+'. זה פתיחה עבור כתיבה וקריאה גם יחד. זה מאפשר לנו לעשות את פקודת ה-seek בתוכנית. התוכנית תפתח קובץ חדש (או תדרוס קובץ קיים) בשם output, תדפיס לתוכו שתי שורות, תקפוץ חזרה לתחילת הקובץ, ותדפיס את מה שהודפס לתוכו.

#!/usr/bin/perl -w
use strict;
use LWP::Simple;
my $url="http://www.altavista.com/web/results?".
        "q=perl&kgs=0&kls=0&avkw=aapt";
my $i=1;
my ($content, $next_url);
while ($url) {
    $content=get($url);
    $i++;
    print $url . "\n";
    open(my $fh, ">", "altavista$i.html");
    print $fh $url, "\n";
    print $fh $content;
    close($fh);
    if ($content=~m|<a href="([^<>"]+)"[^<>]*>\[Next &gt;&gt;\]</a>|) {
        $next_url=$1;
        $url="http://www.altavista.com".$next_url;
        sleep(10);
    } else {
         $url=undef;
    }
}

תוכנית המוציאה את כל הדפים שאלטא-ויסטא מוצאת על פרל. (היא שומרת את דפי אתר האלטא-ויסטא עצמם) אפשר לקחת את זה עוד צעד, ולהדפיס את ה-URL שנמצאו, (ע"י עוד פקודת while בסקריפט שמחפשת לינקים בתוך הדף) אבל זה תעשה בעצמך. התוכנית עובדת בעזרת LWP::Simple, המספקת לנו פקודת get, שמביאה דף מהאינטרנט. יש גם פקודת getstore, שמביאה דף מהאינטרנט ושומרת אותו לדיסק. יש עוד הרבה, אבל נסתפק בזה.

[הקודם : טיפול בקבצים][חזרה לתוכן העניינים][הבא : אינטרנט]

נכתב ע"י שמואל פומברג, כל הזכויות שמורות © ראה פרק 1.5 לתנאי רשיון