OOP ב Perl

amikaml

New member
OOP ב Perl

אני מנסה לעשות משהו פשוט: המודול Circle.pm package Circle; sub new { my $self = {}; $self->{x} = undef; $self->{y} = undef; bless ($self); return $self; } שמוש במודול: script.pl use Circle; $c = circle->new(); בהרצה אני מקבל: Circle.pm did not return a true value at script.pl line 1. BEGIN failed--compilation aborted at script.pl line 1. מה הבעיה במודול? אני לא מצליח למצוא שום רמז ב man pages. (אני משתמש ב ActivePerl 5.8.1) תודה רבה.
 

annefan

New member
1

כן, 1! כל מודול חייב להסתיים בערך אמת, לדוגמא 1. תפתח כל קובץ pm על המחשב שלך ותראה.אגב, גם ההודעה אומרת לך:
Circle.pm did not return a true value​
אגב, אתה לא נופל בריצה, אתה נופל בזמן קומפילציה. ועוד אגב, תשתדל להשתמש בתגים, "תחילת קוד" ו"סיום קוד" כשאתה שם קוד.
 

amikaml

New member
שאלה נוספת - Perl

אין אני מאתחל מספר אוביקטים עם נתונים שונים כשכולם גזורים מאותה מלקה (כמובן package ) (האם אני צריך להוסיף משהו בפונקציות של המודול) תודה!
 

amikaml

New member
דוגמה

מדוע הקוד הזה: תחילת קוד: package Circle; sub new { my $self = {}; $self->{radius} = undef; bless $self; return $self; } sub setr { $self->{radius} = $_[1]; return $self->{radius}; } sub print { print $self->{radius}; print "\n"; } package main; print "***\n"; $c = Circle->new(); $d = Circle->new(); $c->setr(10); $d->setr(20); $c->print(); $d->print(); ------------------סוף קוד נותן 20 20 ולא 10 20 ? תודה
 
יש לך כמה שגיאות בקוד

מצרף את הקוד המתוקן. ראה בהערות
# Aleays compile with strict and warnings # This will prevent a lot of surprises # use strict; use warnings; #------------------------------------------------ package Circle; sub new { my $self = {}; $self->{radius} = undef; bless $self; return $self; } #------------------------------------------------ sub setr { # You must extract the object (and the parameters) from the stack # otherwise you will not be able to access them at runtime # note that in Perl the $self object is not automagically available # my ($self, $radius) = @_; $self->{radius} = $radius; return $self->{radius}; } #------------------------------------------------ sub print { # Once again. $self is passed as the first parameter. # You are responsible to extract it # my ($self) = @_; # Use a local variable # my $radius = $self->{radius}; # It is good to check the input as well # die "Circle::print called on an uninitialized object" unless (defined($radius)); print "$radius\n"; } #------------------------------------------------ # Never forget the return value of the package # 1; #------------------------------------------------ #------------------------------------------------ package main; print "***\n"; my $c = Circle->new(); my $d = Circle->new(); $c->setr(10); $d->setr(20); $c->print(); $d->print();​
 

amikaml

New member
דוגמה

מדוע הקוד הזה: תחילת קוד: package Circle; sub new { my $self = {}; $self->{radius} = undef; bless $self; return $self; } sub setr { $self->{radius} = $_[1]; return $self->{radius}; } sub print { print $self->{radius}; print "\n"; } package main; print "***\n"; $c = Circle->new(); $d = Circle->new(); $c->setr(10); $d->setr(20); $c->print(); $d->print(); ------------------סוף קוד נותן 20 20 ולא 10 20 ? תודה
 

annefan

New member
ליצן

כשאתה שולח הודעה, מתחת לתיבת ההודעה יש "_תחילת_קוד_" ו_סוף_קוד"...
package Circle; sub new { my $self = {}; $self->{radius} = undef; bless $self; return $self; } sub setr { $self->{radius} = $_[1]; return $self->{radius}; } sub print { print $self->{radius}; print "\n"; } package main; print "***\n"; $c = Circle->new(); $d = Circle->new(); $c->setr(10); $d->setr(20); $c->print(); $d->print();​
 

annefan

New member
ועכשיו לעניין

יש לך שלוש טעויות. הגדולה יותר היא שבסקריפט שלך אין בהתחלה שלו:
use strict; use warnings;​
אם היו השורות האלה היית מקבל טעויות קומפילציה, ולא זמן ריצה. הבעיה השניה היא שאתה מניח שהתמיכה ב-OOP בפרל הוא מובנה, כמו ב-++C או בג'אוה. זה לא כך. הבעיה השלישית שנובעת משתי הקודמות היא בעית syntax. בכל קריאה לפונקציה של אוביקט, אתה חייב להגדיר באיזה אוביקט אתה משתמש. מה ש-++C עושה ל-this אתה צריך לעשות ידנית. הנה הסקריפט שלך כשהוא עובד:
use strict; use warnings; package Circle; sub new { my $self = {}; $self->{radius} = undef; bless $self; return $self; } sub setr { my $self = shift; $self->{radius} = shift; return $self->{radius}; } sub print { my $self = shift; print $self->{radius}; print "\n"; } package main; print "***\n"; my $c = Circle->new(); my $d = Circle->new(); $c->setr(10); $d->setr(20); $c->print(); $d->print();​
ועוד הערה קטנה, אל תשתמש במשתנים בני אות אחת.
 

amikaml

New member
תגובה

1. לא הבנתי למה התכוונת בהודעה הקודמת, אבל לא משנה. ממילא אני נוהג להשאיר הודעות לעתים רחוקות. 2. ברור לי שהתמיכה ב OOP ב Perl לא מובנית, והדרך להתמודד עם זה מעניינת אותי, רק שלפעמים מרוב תעוד קשה למצוא מה שרוצים... בכל אופן, תודה.
 

Zack DA

New member
בחור,

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

annefan

New member
לא יודע על מה אתה מתנצל

(וצחי, עד שמגיע לכאן מישהו ששואל שאלות בשפת תכנות רצינית, אל תבריח אותו מכאן!) גם ה"ליצן" היה בחיוך, ולא בכעס. ושמחתי לעזור.
 
למעלה