Perl לשפת הקדמה

‫הקדמה לשפת ‪Perl‬‬
‫סימסטר ב'‪ ,‬תשס"ח‬
‫המכללה האקדמית להנדסה‬
‫הקדמה לשפת ‪Perl‬‬
‫הקדמה‪ ,‬מוטיבציה וסוגי נתונים‬
‫‪1‬‬
‫הקדמה לשפת ‪Perl‬‬
‫סימסטר ב'‪ ,‬תשס"ח‬
‫המכללה האקדמית להנדסה‬
‫מהו ‪?Perl‬‬
‫‬
‫‪Practical Extraction and Report Language‬‬
‫‬
‫שימושי מאד לסריקה מהירה של קובצי טקסט והפקת‬
‫דוחות על אותם קבצים‪.‬‬
‫‪2‬‬
‫הקדמה לשפת ‪Perl‬‬
‫סימסטר ב'‪ ,‬תשס"ח‬
‫המכללה האקדמית להנדסה‬
‫מדוע ‪?Perl‬‬
‫‬
‫‬
‫בביואינפורמטיקה משתמשים הרבה ב‪.Perl -‬‬
‫שפה חזקה מאד עם מחרוזות‪ .‬מחרוזות הן מרכזיות מאד‬
‫בביואינפורמטיקה )רצפי גנים וחלבונים ועוד(‪.‬‬
‫‬
‫מאפשר שימוש נוח בכלים ברשת‪ .‬כך ניתן לעשות שימוש בכלי‬
‫הביואינפורמטיקה הרבים ברשת‪.‬‬
‫‬
‫קיימות ספריות ‪ Perl‬מיוחדות עבור ביואינפורמטקה )‪.(BioPerl‬‬
‫‬
‫נוח מאד לכתיבה של תוכניות קצרות ופשוטות‪.‬‬
‫‪3‬‬
‫סימסטר ב'‪ ,‬תשס"ח‬
‫הקדמה לשפת ‪Perl‬‬
‫המכללה האקדמית להנדסה‬
‫השוואה של ‪ Perl‬עם ‪C‬‬
‫‬
‫‬
‫השווה‪:‬‬
‫אפשר לכתוב הכל בשורה‪ .‬עדיף )חובה( לכתוב בצורה‬
‫מסודרת‪.‬‬
‫‬
‫אפשר לקרוא לספריות מוכנות‪ ,‬הנקראות ‪.Modules‬‬
‫‬
‫קבוצות של פקודות מוגדרות על ידי }{‪.‬‬
‫‬
‫לולאות ותנאים מאד דומים ל‪.C -‬‬
‫‪4‬‬
‫סימסטר ב'‪ ,‬תשס"ח‬
‫הקדמה לשפת ‪Perl‬‬
‫המכללה האקדמית להנדסה‬
‫השוואה של ‪ Perl‬עם ‪C‬‬
‫‬
‫‬
‫השונה‪:‬‬
‫אין שלב קומפילציה‪ .‬אין קוד בינארי‪) .‬הוא כן עובר שלב‬
‫קומפילציה פנימי‪ ,‬כך שתוכנית לא תתחיל לרוץ אם יש בעיות‬
‫‪.(syntax‬‬
‫‬
‫השפה הבסיסית רחבה מאד‪.‬‬
‫‬
‫אין פונקציה ראשית‪ .‬הקובץ רץ מתחילתו עד סופו‪.‬‬
‫‬
‫אין צורך להגדיר משתנים‪ .‬סוג המשתנה אינו כל כך חשוב‪.‬‬
‫‪5‬‬
‫הקדמה לשפת ‪Perl‬‬
‫סימסטר ב'‪ ,‬תשס"ח‬
‫המכללה האקדמית להנדסה‬
‫איך מריצים תוכניות ‪?Perl‬‬
‫‬
‫ב‪ UNIX -‬קיימים שלשה דרכים‪:‬‬
‫‬
‫משורת פקודה‪.‬‬
‫‬
‫מקובץ‪ ,‬עם קריאה ל"פרשן" )‪.(Interpreter‬‬
‫‬
‫מקובץ‪ ,‬ללא קריאה מפורשת ל"פרשן"‪.‬‬
‫‪6‬‬
‫סימסטר ב'‪ ,‬תשס"ח‬
‫הקדמה לשפת ‪Perl‬‬
‫המכללה האקדמית להנדסה‬
‫איך מריצים תכניות ב‪?Perl -‬‬
‫‬
‫משורת פקודה‪:‬‬
‫';"‪> perl -e 'print "Hello, World\n‬‬
‫‪Hello, World‬‬
‫>‬
‫‪7‬‬
‫הקדמה לשפת ‪Perl‬‬
‫סימסטר ב'‪ ,‬תשס"ח‬
‫המכללה האקדמית להנדסה‬
‫איך מריצים תכניות ב‪?Perl -‬‬
‫‬
‫מקובץ‪ ,‬עם קריאה לפרשן‪:‬‬
‫‬
‫בקובץ ‪:hello.pl‬‬
‫‬
‫בשורת הפקודה‪:‬‬
‫;"‪print "Hello, World\n‬‬
‫‪> perl hello.pl‬‬
‫‪Hello, World‬‬
‫>‬
‫‪8‬‬
‫הקדמה לשפת ‪Perl‬‬
‫סימסטר ב'‪ ,‬תשס"ח‬
‫המכללה האקדמית להנדסה‬
‫איך מריצים תכניות ב‪?Perl -‬‬
‫‬
‫מקובץ‪ ,‬ללא קריאה לפרשן‪:‬‬
‫‬
‫בקובץ ‪:hello.pl‬‬
‫‬
‫בשורת הפקודה‪:‬‬
‫‪#!/usr/bin/perl -w‬‬
‫;"‪print "Hello, World\n‬‬
‫‪> chmod +x hello.pl‬‬
‫‪> ./hello.pl‬‬
‫‪Hello, World‬‬
‫>‬
‫‪9‬‬
‫הקדמה לשפת ‪Perl‬‬
‫סימסטר ב'‪ ,‬תשס"ח‬
‫המכללה האקדמית להנדסה‬
‫תיעוד של ‪Perl‬‬
‫‬
‫ניתן להשיג תיעוד מפורט על ‪ Perl‬בכמה מקומות‪:‬‬
‫‬
‫‪ - perldoc‬האתר המרכזי של תיעוד ‪.Perl‬‬
‫‪http://www.perldoc.com/‬‬
‫‬
‫המון קורסים באינטרנט‪ .‬צריך רק לחפש…‬
‫‪10‬‬
‫סימסטר ב'‪ ,‬תשס"ח‬
‫הקדמה לשפת ‪Perl‬‬
‫המכללה האקדמית להנדסה‬
‫סוגי משתנים‬
‫‬
‫סוגי משתנים ב‪:Perl -‬‬
‫‬
‫סקלרים )‪.(Scalars‬‬
‫‬
‫מערכים )‪.(Lists‬‬
‫‬
‫‘השים’ )‪.(Hashes‬‬
‫‬
‫נעבור עליהם לפי הסדר בשיעורים הקרובים‪.‬‬
‫‪11‬‬
‫הקדמה לשפת ‪Perl‬‬
‫סימסטר ב'‪ ,‬תשס"ח‬
‫המכללה האקדמית להנדסה‬
‫ְס ַק ַל ִרים‬
‫‬
‫מכילים ערך אטומי ‪ -‬מספר או מחרוזת‪.‬‬
‫;‪$a = 613‬‬
‫;"!‪$b = "Hello, World‬‬
‫‬
‫שים לב‪ .‬כל שורה ב‪ ,Perl -‬כמו ב‪ ,C -‬מסתיימת בנקודה‪-‬פסיק‬
‫);(‪.‬‬
‫‪12‬‬
‫הקדמה לשפת ‪Perl‬‬
‫סימסטר ב'‪ ,‬תשס"ח‬
‫המכללה האקדמית להנדסה‬
‫סקלרים‬
‫‬
‫מספר ‪ -‬אין צורך להגדיר את סוג המספר‪ .‬כל המספרים‬
‫מיוצגים על ידי המערכת כמו ‪ double‬של ‪.C‬‬
‫‬
‫מחרוזת ‪ -‬אין צורך להגדיר את אורך המחרוזת‪.‬‬
‫המחרוזת יכולה להיות באורך של כל הזיכרון של המחשב‬
‫)לא מאד יעיל‪ ,‬אך אפשרי(‪.‬‬
‫‪13‬‬
‫הקדמה לשפת ‪Perl‬‬
‫סימסטר ב'‪ ,‬תשס"ח‬
‫המכללה האקדמית להנדסה‬
‫מחרוזות‬
‫‬
‫‬
‫שני סוגים‪:‬‬
‫סגור על ידי גרש‪ .‬כל מה שיש בין שני הגרשים הוא המחרוזת‪.‬‬
‫כדי להכיל גרש‪ ,‬יש להקדימו בקו נטוי אחורי \‪.‬‬
‫כדי להכיל \‪ ,‬יש להקדימו ב‪.\ -‬‬
‫דוגמא‪:‬‬
‫’;‪$a = ‘who\’s computer\\s is\\are this\\these‬‬
‫‪# $a = who’s computer\s is\are this\these‬‬
‫‬
‫‪14‬‬
‫הקדמה לשפת ‪Perl‬‬
‫סימסטר ב'‪ ,‬תשס"ח‬
‫המכללה האקדמית להנדסה‬
‫מחרוזות‬
‫‬
‫סגור על ידי גרשיים‪.‬‬
‫כאן‪ ,‬ל‪ \ -‬יש תפקידים רבים‪ .‬הוא מסמל תוים מיוחדים בתוך‬
‫המחרוזת‪ .‬דוגמאות חשובות‪:‬‬
‫‪newline‬‬
‫‪tab‬‬
‫‪bell‬‬
‫‪Double quote‬‬
‫יש יתרונות נוספים לסוג זה של מחרוזת‪ ,‬כפי שנראה‪.‬‬
‫‪15‬‬
‫‬‫‬‫‬‫‪-‬‬
‫‪\n‬‬
‫‪\t‬‬
‫‪\a‬‬
‫"\‬
‫הקדמה לשפת ‪Perl‬‬
‫סימסטר ב'‪ ,‬תשס"ח‬
‫המכללה האקדמית להנדסה‬
‫מחרוזות‬
‫‬
‫מחרוזת המכילה מספר רב של גרשיים‪ ,‬ניתן ליצור‬
‫בדרכים רבות אחרות )כל דבר ב‪ Perl -‬ניתן לבצע‬
‫בדרכים רבות אחרות(‪:‬‬
‫;‪$a = qq/who’s computer\s is\are this\these/‬‬
‫‬
‫למעשה‪ ,‬ניתן להקיף המחרוזת בכל זוג תוים זהים‪ ,‬כגון &‪.‬‬
‫;&‪$a = qq&who’s computer\s is\are this\these‬‬
‫‪16‬‬
‫הקדמה לשפת ‪Perl‬‬
‫סימסטר ב'‪ ,‬תשס"ח‬
‫המכללה האקדמית להנדסה‬
‫מחרוזות‬
‫‬
‫קיימים סוגים שונים של פונקציות להגדרת מחרוזות‪.‬‬
‫בטבלה הבאה מוצגים רובם כפי שמופיעים ב‪.perlop -‬‬
‫‪Literal‬‬
‫‪no‬‬
‫‪Literal‬‬
‫‪yes‬‬
‫‪Command‬‬
‫*‪yes‬‬
‫‪Word list‬‬
‫‪no‬‬
‫‪Pattern match‬‬
‫*‪yes‬‬
‫‪Pattern‬‬
‫*‪yes‬‬
‫‪Substitution‬‬
‫*‪yes‬‬
‫‪Transliteration no‬‬
‫‬
‫}{‪'' q‬‬
‫}{‪"" qq‬‬
‫}{‪`` qx‬‬
‫}{‪qw‬‬
‫}{‪// m‬‬
‫}{‪qr‬‬
‫}{}{‪s‬‬
‫}{}{‪tr‬‬
‫בחלק מפונקציות אלו נעסוק בהמשך הקורס‪.‬‬
‫‪17‬‬
‫הקדמה לשפת ‪Perl‬‬
‫המכללה האקדמית להנדסה‬
‫סימסטר ב'‪ ,‬תשס"ח‬
‫משתנה סקלר‬
‫‬
‫השם מתחיל ב‪ $ -‬מלווה באות ולאחר מכן עד ‪253‬‬
‫תוים‪ ,‬ספרות או קוים תחתיים )_(‪.‬‬
‫‪$a_very_long_name‬‬
‫‬
‫השם הוא ‪.Case Sensitive‬‬
‫‬
‫חשוב מאד לתת שמות עם משמעות‪.‬‬
‫‪!= $A_very_long_name‬‬
‫‪18‬‬
‫הקדמה לשפת ‪Perl‬‬
‫סימסטר ב'‪ ,‬תשס"ח‬
‫המכללה האקדמית להנדסה‬
‫השמה‬
‫‬
‫השמה למשתנה נעשית על ידי האופרטור =‪.‬‬
‫‬
‫ביטוי ההשמה שקול לשם המשתנה‪:‬‬
‫‪# $b=7, $a=3.‬‬
‫‬
‫כמו ב‪ .C -‬קיימות השמות בינאריות‪:‬‬
‫‬
‫השמות בינאריות עם מחרוזות‪:‬‬
‫;)‪$b=4+($a=3‬‬
‫;‪$a+=5; $b*=6‬‬
‫;"‪$str="Some stuff‬‬
‫;"‪$str.=", Some more stuff‬‬
‫;"‪# $str="Some stuff, Some more stuff‬‬
‫‪19‬‬
‫הקדמה לשפת ‪Perl‬‬
‫סימסטר ב'‪ ,‬תשס"ח‬
‫המכללה האקדמית להנדסה‬
‫תרגיל ‪1‬‬
‫‬
‫כתוב תוכנית שתציג את הטבלה הבאה‪:‬‬
‫‪Grade‬‬
‫‪----‬‬‫‪96‬‬
‫‪90‬‬
‫‪85‬‬
‫‬
‫‪Course‬‬
‫‪-----‬‬‫"‪"Bioinfo‬‬
‫"‪"Genetics‬‬
‫"‪"DB's‬‬
‫מבנה הטבלה‪ :‬שני הטורים מופרדים על ידי שני ‪.tab‬‬
‫השורות מופרדות על ידי ‪.Enter‬‬
‫‪20‬‬
‫המכללה האקדמית להנדסה‬
‫ תשס"ח‬,'‫סימסטר ב‬
Perl ‫הקדמה לשפת‬
‫פתרון‬
#!/usr/bin/perl
$caption = "Course\t\tGrade\n------\t\t----\n\n";
$bioinfo = "\"Bioinf\"\t\t96\n";
$genetics = qq/"Genetics"\t\t100\n/;
print $caption, $bioinfo, $genetics;
21
‫הקדמה לשפת ‪Perl‬‬
‫סימסטר ב'‪ ,‬תשס"ח‬
‫המכללה האקדמית להנדסה‬
‫אופרטורים‬
‫‬
‫ישנם אופרטורים עבור מספרים ואופרטורים עבור‬
‫מחרוזות‪ .‬רובם מוכרים מ‪.C -‬‬
‫‬
‫אופרטורים חשבוניים )רק עבור מספרים(‪.‬‬
‫‪+, -, *, /, +=, -=, --, ++‬‬
‫‬
‫אופרטורים מיוחדים‪:‬‬
‫‪#$a=1.‬‬
‫‪#$a=8.‬‬
‫‪22‬‬
‫;‪$a = 10 % 3‬‬
‫;‪$a = 2 ** 3‬‬
‫הקדמה לשפת ‪Perl‬‬
‫סימסטר ב'‪ ,‬תשס"ח‬
‫המכללה האקדמית להנדסה‬
‫אופרטורים‬
‫‬
‫אופרטורים להשוואה )עבור מספרים ומחרוזות(‪:‬‬
‫שווה‬
‫שונה‬
‫גדול‬
‫קטן‬
‫גדול‪-‬שווה‬
‫קטן‪-‬שווה‬
‫שרשור‬
‫‬
‫מספרים‬
‫==‬
‫=!‬
‫>‬
‫<‬
‫=>‬
‫=<‬
‫מחרוזות‬
‫‪eq‬‬
‫‪ne‬‬
‫‪gt‬‬
‫‪lt‬‬
‫‪ge‬‬
‫‪le‬‬
‫‪.‬‬
‫השוואה נעשית בתנאי ‪ if‬ובלולאות‪ ,‬כפי שנראה בהמשך‪.‬‬
‫‪23‬‬
‫הקדמה לשפת ‪Perl‬‬
‫סימסטר ב'‪ ,‬תשס"ח‬
‫המכללה האקדמית להנדסה‬
‫העברה בין מספרים למחרוזות‬
‫‬
‫מחרוזת המופיעה במקום שאמור להיות מספר‪Perl ,‬‬
‫מתייחס רק אל הספרות מתחילת המחרוזת עד האות‬
‫הראשונה‪.‬‬
‫‪34rr00"; # $a = 36.‬‬
‫‬
‫"‪$a = 2+‬‬
‫מספר המופיע במקום מחרוזת‪ ,‬נחשב למחרוזת המכילה‬
‫את ספרות המספר‪.‬‬
‫‪# $a = "R2D2".‬‬
‫‪24‬‬
‫;‪$a = "R2D".2‬‬
‫הקדמה לשפת ‪Perl‬‬
‫סימסטר ב'‪ ,‬תשס"ח‬
‫המכללה האקדמית להנדסה‬
‫אופרטורים לקידום‬
‫‬
‫אופרטורים לקידום )כמו ב‪:(C -‬‬
‫‪# $a=2.‬‬
‫‬
‫;‪$a = 1; $a++‬‬
‫כמו ב‪ ,C -‬יש הבדל אם האופרטור קודם למשתנה או‬
‫אחריו‪.‬‬
‫‪#$b=2, $c=4.‬‬
‫‪25‬‬
‫;‪$b = $a++; $c = ++$a‬‬
‫הקדמה לשפת ‪Perl‬‬
‫סימסטר ב'‪ ,‬תשס"ח‬
‫המכללה האקדמית להנדסה‬
‫אינטרפולציה של משתנים לתוך מחרוזות‬
‫‬
‫היתרון הגדול של מחרוזות סגורות‪-‬גרשיים‪.‬‬
‫‬
‫שמות של משתנים בתוך המחרוזת מוחלפים על ידי‬
‫ערכיהם‪.‬‬
‫;'‪$species = 'Homo Sapiens‬‬
‫;"‪$line = "We are currently studying $species\n‬‬
‫‬
‫אם רוצים להכיל את התו ‪ ,$‬יש להקדימו ב‪ . \ -‬אם‬
‫רוצים להצמיד לשם המשתנה טקסט‪ ,‬סוגרים את השם‬
‫ב‪.{} -‬‬
‫;"‪$line2 = "One ${species}-skeleton costs 1m\$'s‬‬
‫‪26‬‬
‫הקדמה לשפת ‪Perl‬‬
‫המכללה האקדמית להנדסה‬
‫סימסטר ב'‪ ,‬תשס"ח‬
‫ערך ‪undef‬‬
‫‬
‫לפני השמת ערך למשתנה‪ ,‬ערכו הוא ערך מיוחד הנקרא‬
‫‪ ,undef‬המיתרגם ל‪ 0 -‬ומחרוזת ריקה‪.‬‬
‫‪# 3‬‬
‫‬
‫;‪print $x+3‬‬
‫ניתן לבדוק אם הושם במשתנה ערך על ידי הפונקציה‬
‫‪.defined‬‬
‫{‬
‫‪27‬‬
‫)‪if (not defined $x‬‬
‫;‪$x=0‬‬
‫}‬
‫הקדמה לשפת ‪Perl‬‬
‫סימסטר ב'‪ ,‬תשס"ח‬
‫המכללה האקדמית להנדסה‬
‫קבלת נתונים מהמשתמש‬
‫‬
‫קבלת ערך סקלרי מהמשתמש‪:‬‬
‫‬
‫מקבל ערך מהקלט הסטנדרטי‪ ,‬בדרך כלל הטרמינל‬
‫;>‪$a = <STDIN‬‬
‫המריץ‪.‬‬
‫‬
‫הערך המתקבל מ‪ <STDIN> -‬תמיד מלווה בתו סוף‬
‫שורה‪ .\n ,‬כדי להסירו יש פונקציה מיוחדת‪ ,‬המסירה את‬
‫התו האחרון במחרוזת‪:‬‬
‫)‪$b = chop($a‬‬
‫‪28‬‬
‫הקדמה לשפת ‪Perl‬‬
‫המכללה האקדמית להנדסה‬
‫סימסטר ב'‪ ,‬תשס"ח‬
‫קבלת נתונים מהמשתמש‬
‫‬
‫הפונקציה מחזירה את התו שהוסר‪.‬‬
‫‬
‫פונ' אחרת‪ ,chomp() ,‬מורידה אך ורק תו ‪ \n‬מסוף‬
‫המחרוזת‪ .‬נוח אם לא בטוחים אם יש תו ‪ \n‬או שאין‪.‬‬
‫‬
‫אפשר לשלב את הקבלה עם הקיצוץ‪:‬‬
‫;)>‪chomp($a=<STDIN‬‬
‫‪29‬‬
‫הקדמה לשפת ‪Perl‬‬
‫סימסטר ב'‪ ,‬תשס"ח‬
‫המכללה האקדמית להנדסה‬
‫תרגיל ‪2‬‬
‫‬
‫קבל שם ורצף גנטי מקודד‪ ,‬והדפס מחרוזת שתכיל את‬
‫הנתונים הבאים‪ :‬שם המדען‪ ,‬הרצף‪ ,‬מספר חומצות‬
‫האמינו בחלבון ומשקלו‪.‬‬
‫‬
‫נתונים‪:‬‬
‫‬
‫כל ‪ 3‬בסיסים מקודדים לח"א אחת‪.‬‬
‫‬
‫משקלו הממוצע של ח"א הוא ‪.110kDa‬‬
‫‬
‫אורך מחרוזת מתקבל על ידי הפונ' )‪.length($str‬‬
‫‪30‬‬
‫המכללה האקדמית להנדסה‬
‫ תשס"ח‬,'‫סימסטר ב‬
Perl ‫הקדמה לשפת‬
‫פתרון‬
#!/usr/bin/perl -w
chomp($scientist=<STDIN>);
chomp($sequence=<STDIN>);
$prot_length=length($sequence)/3;
$prot_weight=($prot_length*110)."kDa;"
$final="Author: $scientist, seq: $sequence.
Prot. length=$prot_length. Prot.
weight=$prot_weight;"
print $final;
31
‫הקדמה לשפת ‪Perl‬‬
‫סימסטר ב'‪ ,‬תשס"ח‬
‫המכללה האקדמית להנדסה‬
‫תרגיל ‪3‬‬
‫‬
‫כתוב תכנית שתקבל מהמשתמש שני רצפי ‪DNA‬‬
‫ותכתוב לטרמינל שרשור של שני הרצפים‪ ,‬בשלש דרכים‬
‫שונות‪.‬‬
‫‪32‬‬
‫המכללה האקדמית להנדסה‬
‫ תשס"ח‬,'‫סימסטר ב‬
Perl ‫הקדמה לשפת‬
‫פתרון‬
#!/usr/bin/perl
chomp($DNA1=<STDIN>);
chomp($DNA2=<STDIN>);
$fullDNA1="$DNA1$DNA2\n";
# Method 1.
$fullDNA2=$DNA1.$DNA2."\n";
# Method 2.
print $fullDNA1, $fullDNA2, $DNA1,$DNA2,"\n";
# Method 3.
33