تعليم لغة بيرل Perl و سي جي آي CGI

 

 

الدرس الثاني

 

 

 

إعداد خادم HTTP :

لا يمكنك تشغيل تطبيقات CGI بدون خادم ويب Web Server ، و الأغلبية العظمى من خوادم الويب يعملوا على نظام يونيكس Unix إلا أن هناك العديد من خوادم الويب العاملين على الويندوز أيضاً . من هذه الخوادم خادم Sambar Server و هو مجاني يمكنك الحصول عليه من هذا الموقع . بعد تنزيله فك ضغطه و شغل الملف setup.exe و بعد ذلك يمكن تشغيله من قائمة إبدأ Start ، و هو لا يظهر نافذة عند بدء تشغيله ، فقط ستلاحظ أيقونته بجوار الساعة في صينية النظام System Tray . و إذا كان هذا البرنامج فعالاً فإنه يحيل حاسبك إلى خادم ويب مصغر تستطيع فيه تشغيل برامج البيرل و السي جي آي كأي خادم ويب عادي على الإنترنت ، و لا يلزمك حتى الاتصال بالإنترنت .

الكتابة بالهتمل :

تعلمنا أنه عندما نطبع أي شيء من برنامج بيرل عبر سي جي آي فسوف يتم إرساله إلى الخادم الذي عليه أن يقرر بعد ذلك ما الذي يجب عليه فعله . و الخادم يتوقع أن يكون كل شيء يتم إرساله إليه في واحد من صيغ عديدة كلها تخضع لمقياس MIME ، و هو بروتوكول لنقل الملفات التي ليست على هيئة أسكي ASCII مثل الصور و الرسوم و الملفات الصوتية باستخدام بروتوكول نقل النصوص . و لغة هتمل HTML تفي بالغرض لهذا الجزء ، فهي خاضعة لمواصفات MIME أيضاً .

الآن نحن لم نعد نطبع إلى الشاشة ، بل إلى خادم الويب و بالتالي نحتاج إلى مخاطبة خادم الويب باللغة التي يفهمها (الخاضعة لمقياس مايم) و هي لغة هتمل HTML ، و لذلك فإننا يجب أن نعيد بناء برنامجنا الأول ليرسم صفحة ويب يستطيع خادم الويب فهمها و عرضها .

افتح محرر النص و اكتب السطور التالية ثم احفظها باسم hellowww.pl في الفهرس الذي يتوقع خادم الويب أن يجد فيه برامج CGI و هو عادة يكون في c:\program files\sambar\cgi-bin :

#!c:/perl/bin

#hellowww.pl

# A perl program that draws a web page.

print "Content-type: text/html","\n\n"; # MIME header

print "<html>","\n";

print "<head>";

print "<title>Perl Meets the World Wide Web</title>","\n";

print "</head>","\n";

print "<body>","\n";

print "<h1>Hello World !</h1>","\n";

print "</body>","\n";

print "</html>","\n";

# End Hellowww.pl

الآن جئنا للنقطة المهمة ، كيف تشغل هذا البرنامج . تأكد أولاً من أن Sambar Server فعال و أن أيقونته موجودة في صينية النظام ثم افتح متصفحك و اكتب فيه العنوان التالي localhost/cgi-bin/hellowww.pl و اضغط زر الإدخال . هل كان الناتج مثل هذه الصورة :

تهانينا .. لقد قمت بكتابة و تشغيل أول برنامج سي جي آي خاص بك .

في هذا البرنامج جمل اطبع print أصبحت تكتب شفرة هتمل HTML . و قد عرف الخادم ماذا يفعل في هذا البرنامج بسبب أول سطر قابل للتنفيذ في البرنامجprint "Content-type: text/html فهو قد أخبر الخادم أن محتوى المعلومات المرسلة إليه هي نص و أن هذا النص من نوع HTML . باقي البرنامج يطبع جمل هتمل أساسية .

الوظائف الفرعية Subroutines في بيرل :

مخترع بيرل (لاري وول) كتب ذات مرة أن أفضل ثلاث ميزات للبرمجة هي الكسل و عدم الصبر و التعالي . هذه الجملة تعبر عن حقائق مهمة للغاية يمكننا توضيحها كالآتي : الكسل و عدم الصبر يجعلان المبرمجين يقتلوا أنفسهم لتجنب فعل الأشياء أكثر من مرة واحدة ، و لهذا تم اختراع الوظائف الفرعية Subroutines لكي تجنب المبرمجين من فعل الشيء نفسه مرة و مرات عديدة أخرى . الوظيفة الفرعية هي كتلة من الشفرة تستدعي كتلة أخرى من الشفرة تم حفظها مسبقاً و تنفذها و بعد أن تنتهي من تنفيذها تكمل تنفيذ نفسها . و بمفهوم أكثر فجاجة ، والدك أمرك أن تؤدي ثلاثة أعمال متتالية ، مثلاً اغسل السيارة ثم تشتري علبة سجائر له ثم تصعد إلى السطح لتضبط اتجاه الهوائي (الإيريال) . أنت غسلت السيارة و تعبت و البائع بعيد ، فناديت على أخيك الصغير و أعطيته ريال أو ريالين ليذهب إلى البائع و يشتري علبة سجائر و انتظرته حتى عاد ثم أخذت منه علبة السجائر و ذهبت لتعطيها لوالدك ثم صعدت إلى السطح لتضبط الهوائي . و في أي وقت آخر إذا بعثك والدك لتشتري له شيئاً لا يستحق ذهابك بنفسك ترسل أخيك الصغير (المتواجد دائماً) و كان الله في عون ميزانيتك . هذه فكرة عامة عن مفهوم الوظائف الفرعية subroutines ، (و أرجو أن تكونوا قد استوعبتم المقصود منه) .

بالنسبة للتعالي فهذا شيء لن تعرفه إلا بعد أن تصبح مبرمج مشهور يشير الجميع إليه و يقولون (معنا الخبير .. معنا الخبير) . و بالنسبة للمبتدئين أمثالنا فأي شيء مهما يكن تجد أن برنامجك يفعله أكثر من مرة يجب وضعه في وظيفة فرعية subroutine حتى يمكن استدعائه مرة أخرى إذا احتجت إليه .

استعمال أمر Require :

برنامج hellowww.pl لا يفعل أي شيء أكثر من مرة واحدة و بالرغم من ذلك فهو يحتوي على بعض الشفرة التي ستستعملها على الأقل مرة واحدة في كل برنامج سي جي آي تكتبه . هذه الأجزاء هي التي ترسم حدود صفحة الويب و هي تتكون من جزئين : جزء علوي هو الآتي :

 

print "Content-type: text/html","\n\n"; # MIME header

print "<html>","\n";

print "<head>";

print "<title>Perl Meets the World Wide Web</title>","\n";

print "</head>","\n";

و جزء سفلي هو الذي يحدد نهاية صفحة الهتمل ، و هو الآتي :

 

print "</body>","\n";

print "</html>","\n";

سوف نستفيد من هذين الجزئين بأن نضع كل جزء منهما في ملف منفصل ثم نستعمل وظيفة require لاستدعائهما في الأماكن الملائمة في أي برنامج نريده . و لكن يجب أن نلاحظ أن وظيفة require تعرف لك الوظيفة الفرعية التي استدعيتها و لكنها لا تستعملها ، الآن نعرف كيف نستعملها . دعنا الآن نبدأ بعمل وظيفة فرعية من شفرة الجزء السفلي ، افتح محرر النص و اكتب هذه الأسطر :

#!c:/perl/bin

# set up a standard HTML footer section. At this point , it simply

# ends the Body and HTML sections.

sub HTML_Footer

{

print "\n","</body>","\n";

print "</html>","\n";

}

1;

# End HTML_Footer

احفظ الملف باسم htmlend.pl .

كلمة sub تعرف الشفرة الآتية بعدها بأنها وظيفة فرعية خاصة كل الشفرة ما بين أداتي الحصر المفتوحتين } { . أما HTML_Footer فهي اسم الوظيفة الفرعية الذي نستطيع أن نناديها به . أما رقم 1 الذي وضعناه كسطر منفصل في نهاية الشفرة فهو لكي يرشد المترجم أن عملية تنفيذ هذه الوظيفة الفرعية قد تمت بنجاح و أن قيمتها 1 و هي قيمة حقيقية ليست فارغة أو خاطئة ، و يمكنك الانتقال لتنفيذ باقي خطوات البرنامج .

تركيب ملف شفرة الجزء السفلي :

لنستعمل الوظيفة الفرعية التي أعددناها في htmlend.pl سوف نغير أشياء بسيطة في مثالنا السابق hellowww.pl . افتح ملف hellowww.pl باستخدام محرر النص المفضل عندك و أجر التغيرات التالية :

 

#!c:/perl/bin

#hellowww.pl

# A perl program that draws a web page- with subroutines.

require "htmlend.pl"; # Call in file.

print "Content-type: text/html","\n\n"; # MIME header

print "<html>","\n";

print "<head>";

print "<title>Perl Meets the World Wide Web</title>","\n";

print "</head>","\n";

print "<body>","\n";

print "<h1>Hello World !</h1>","\n";

&HTML_Footer;

# End hellowww.pl

هل لاحظت التغيير ؟ لقد أضفنا وظيفة require في أول البرنامج لتستدعي الملف htmlend.pl و لكننا لم نستفيد من محتوياته أو وظائفه في حينها ، بل استفدنا منها عندما وضعنا اسم الوظيفة الفرعية الموجودة في الملف بعد علامة & في المكان الذي احتجنا إليها فيه ، أي في نهاية البرنامج .

و لاحظ أن require تتطلب أن تظهر السلسلة الخاصة بها بين علامتي اقتباس مثل وظيفة print . بالطبع يجب عليك أن تضع ملف htmlend.pl في نفس المكان الذي يوجد فيه ملف hellowww.pl و إلا فإن وظيفة require سوف تفشل و تهدم باقي البرنامج .

تركيب شفرة الجزء العلوي :

أولاً يجب أن نضع شفرة الجزء العلوي في ملف منفصل كما تعلمنا لنستخدمه كوظيفة فرعية . افتح محرر النص و اكتب السطور التالية ثم احفظها باسم htmlhead.pl في نفس مكان الملفين السابقين كما اتفقنا :

 

#!c:/perl/bin

# set up a standard HTML header section

# with the page title passed to it.

sub HTML_Header

{

print "Content-type: text/html","\n\n"; # MIME header

print "<html>","\n\n";

print "<head>","\n\n";

print "<title>","@_","</title>","\n\n";

print "</head>","\n\n";

}

1;

# End HTML_Header.pl

هناك علامة جديدة مذكورة بعد <title> و هي _@ هل خمنت عملها ؟؟ سأخبرك بها بعد أن تعدل الملف التالي ، الآن عدل ملف hellowww.pl مرة أخرى كما يأتي :

#!c:/perl/bin

# hellowww.pl

# A perl program that draws a web page - with subroutines.

require "htmlhead.pl"; # call in files

requrie "htmlend.pl";

&HTML_Header ("perl meets the World Wide Web");

print "<body>","\n";

print "<h1>Hello World !</h1>","\n";

&HTML_Footer;

# End hellowww.pl

نلاحظ على هذه التعديلات أنها قد جعلت من البرنامج القصير برنامجاً أقصر قليلاً . هذا جيد فالقاعدة الأولى من الكسل و عدم الصبر هو تقليل الكتابة .

أما بالنسبة للعلامة التي جذبت انتباهنا في ملف htmlhead.pl عند السطر :

print "<title>","@_","</title>","\n\n";

العلامة @ هي واحدة من علامات الاختصار العديدة السهلة في بيرل و لكنها مربكة إلى حد ما ، و هي كما عرفنا تشير إلى قائمة أو مجموعة و هي هنا خاصة بسلسلة حرفية أو عدة سلاسل . و يمكننا أن نستبدل الشرطة _ فيها بأي سلسلة حرفية عندما نستدعي هذه الوظيفة الفرعية في برنامج آخر ، و هذا ما فعلناه ، حين استبدلنا الشرطة _ بالعبارة "perl meets the world wide web" في :

&HTML_Header ("perl meets the World Wide Web");

لاحظ أننا وضعنا السلسلة الحرفية بين علامتي اقتباس كالعادة و لكن وضعناهم بين قوسين لنعرف البرنامج أن هذه هي المقابل للشرطة الموجودة في الوظيفة الفرعية .

الآن شغل المتصفح الخاص بك ، و تأكد من أن Sambar Server فعّال و شغل الملف hellowww.pl كما تعلمنا من قبل :

كما لاحظت لا يوجد اختلاف بين ما يعرضه المتصفح الآن و ما عرضه في برنامج hellowww.pl الأول ، انت قمت بنفس العمل و لكن في وقت أقل و كفاءة أكبر .

استعمال ملف Hosts :

عندما تكتب عنوان أي موقع في المتصفح فإن هذا العنوان بالنسبة له لا يعني شيئاً ، يجب أن يكون العنوان مترجماً إلى عنوان IP مثل :

198.169.20.0

يجب أن يترجم العنوان الوصفي إلى عنوان IP قبل أن يمكنه التعامل معه ، و بالتالي فإن المتصفح يحصل على مقابل العنوان الوصفي الذي كتبته عن طريق Domain Name Server أو اختصاراً DNS و هو جدول من أسماء المجالات Domain Names مثل : www.single.com و عناوين آي بي المقابلة لها ، فيعطيه المتصفح العنوان الوصفي أو اسم المجال و يعطيه DNS العنوان العددي المقابل .

و إذا كان المتصفح الخاص بك ليس متصلاً بالإنترنت فإنه ليس لديه وسيلة لتحليل أسماء المجال أو ال Domain Names ، و مع ذلك فإن DNS هو المكان الثاني الذي يبحث فيه عن العناوين ، أما المكان الأول فهو ملف Hosts الموجود في مجلد الويندوز في جهازك :

كما ترى فهو ملف نص عادي يمكنك فتحه بأي محرر نصوص مثل Notepad . كل الأسطر في هذا الملف ما عدا السطر الأخير تبدأ بعلامة التعليق كما نعرف ، أما السطر الأخير الذي ليس به تعليق فهو يعرّف العنوان الذي يشير إلى الكمبيوتر المحلي أي جهازك و هو Localhost و مقابله في عناوين الآي بي هو (1 . 0 . 0 . 127) . الآن إذا كان Sambar Server عاملاً ، يمكنك توجيه المتصفح لديك إلى العنوان http://localhost ليعرض لك الصفحة الداخلية الأساسية لبرنامج الخادم Sambar العامل على حاسبك .

 

 

استفسار ؟ راسلني

الدرس الثالث