تعليم لغة بيرل 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 العامل على حاسبك .
استفسار ؟ راسلني