6.4 لغة البرمجة perl
مقدمة
تعتبر perl لغة مميزة أكثر ما يميزها هو سهولتها فهي مثل ال basic
في السهولة ومثل ال C في القوة (إلا أنها لغة تفسيرية أي أقل سرعة من ال C)
وتعتبر perl اختصاراً لجملة
Practicl Extrction Reoprt Language
ولكنها تعني لمؤلف كتاب perl by exmaple أكثر من ذلك فهي
Practicl Everythhing Really Likeable
أكثر ما يميز قوة هذه اللغة هو قدرتها على التعامل
مع سلاسل النصوص strings فهي توفر عدد كبير جداً
من الوظائف لهذه الغاية
فهي لغة مفضلة لعمل برامج الإعداد
في تحديث ملفات الإعدادات النصية.
و perl لغة قابلة للتطور اذ يمكنها استعمال برامج
خارجية تمدها بالمزيد من الوظائف تسمى modules
ومعظم توزيعات لينكس تركّب perl تلقائياً
يمكن استعمال هذه اللغة في عمل برامج تطبيقية رسومية
أو ألعاب أو حتى صفحات انترنت تفاعلية(منتديات أو غرف دردشة) ،نعم فهي أيضاً تستخدم
على أنها CGI-script على خادم apache
البرنامج الأول
لكتابة برنامج بكل بساطة افتح محرر النصوص لمفضل لديك
واكتب فيه #!/usr/bin/perl
وخزن برنامج بأي امتداد يفضل pl أو perl مثلا hello.perl
ثم اسمح للكل بتشغيل هذا الملف بكتابة
chmod +x hello.perl
والآن لتشغيل البرنامج اكتب
./hello.perl
أو فقط
hello.perl
ويمكن تشغيل البرنامج بكتابة
perl hello.perl
هذا هو برنامجنا الأول
#!/usr/bin/perl
# this is my 1st perl program
print "Hello World!!\n";
خزن هذا الملف باسم hello.perl واسمح بتنفيذه ثم اكتب
perl -c hello.perl
للتأكد من صحة البرنامج دون تنفيذه
اذا لم يعطك أي خطأ قم بتنفيذ البرنامج اما بالنقر عليه أو بكتابة
اسمه أو ب perl hello.perl
واذا أردت أن يطبع تحذيرات اكتب perl -w hello.perl
للمزيد من الخيارات انظر دليل perl بكتابة man perl
السطر الأول هو shabang (أي علامة # ثم علامة !) ليحدد مفسر لغة perl
كما في أي لغة تفسيرية انظر القسم السابق (لغة برمجة bash)
السطر الذي يليه هو تعليق لا معنى له
يوضع للشرح ويحدد ب #
أما السطر الثالث فهو يطبع ما بداخل علامة التنصيص
انتبه لغة perl مثل معظم لغات لينكس حساسة لكون الحروف كبيرة أم صغيرة
أي print تختلف عن PRINT وعن Print.
بالنسبة ل /n فهي لن تطبع
ولكنها تعني سطراً جديداً
بعد كل أمر من أوامر perl عدا التعليقات يجب أن تضع فاصلة منقوطة
;
الصيغة العامة
للتعامل مع متغير نكتب $ قبل اسم لمتغير مثلا
$a=15; تعني أن قيمة المتغير a هي 15
ويمكن استخدام الفاصلة العشرية
$b=15.4;
أو الأسلوب الهندسي
$c=3.0E+8; التي تعني 3x108
وللتعبير عن رقم بالنظام الست-عشري نضع 0x
مثلا $d=0xff;
أما الأرقام بالنظام الثماني نضع صفراً قبل الرقم
مثلا $e=011; تعني 9
أما للتعبير عن السلاسل النصية strings نستخدم علامة التنصيص(الإقتباس) المفردة
أو المزدوجة والفرق بينهما هو كما هو في bash وغيرها
فعلامة التنصيص المزدوج أو التنصيص الضعيف كما سنسميها
تسمح بعمليات التعويض مثلا
print "a is $a"; لن تطبع
a is $a وإنما ستطبع مكان
$a قيمة المتغير a وهذا مايسمى التعويض
ومن الأشياء الأخرى التي يتم تعويضها غير المتغيرات هي
الأوامر المحاطة ب `command`
حيث تعطي ناتج (standard output) تنفيذ الأمر
انتبه ` هي الموجودة على يسار 1 وفوق حرف الذال
وليس علامة التنصيص المفردة
وأيضا يتم تعويض
escape-sequences وهي \ متبوع برمز معين يمثل معنى خاص وهي
| \n |
سطر جديد
|
| \r |
العودة لبداية السطر الحالي للكتابة فوقه
|
| \b |
backspace حذف حرف للوراء
|
| \f |
formfeed صفحة جديدة
|
| \a |
تصدر صوت alert
|
| \t |
tab أي مسافة جدولة
|
| \e |
رمز escape أي 27 أو 033 بالثماني أو 0x1b بالست-عشري
|
| \0nnn |
تعني الرمز المقابل ل nnn حيث nnn رقم بالثماني مثلا 33 هي escape و 101 تعني حرف A
|
| \xnn |
تعني الرمز المقابل ل nnn حيث nnn رقم بالست-عشري مثلا1b هي escape و 41 تعني حرف A
|
| \u |
تحول الحرف الإنجليزي التالي إلى upper-case أي كبير
|
| \l |
تحول الحرف الإنجليزي التالي إلى lower-case أي صغير
|
| \U |
تحول الحروف الإنجليزية التالية إلى upper-case أي كبيرة حتى أول \E
|
| \L |
تحول الحروف الإنجليزية التالية إلى lower-case أي صغيرة حتى أول \E
|
| \Q |
تنصص ال Regular Expr حتى أول \E
|
| \E |
انهاء كل من \U و \L و \Q
|
و \ مع أي شيء آخر تعني ذلك الشيء نفسه وليس معناه
وفائدة هذا مثلا إذا أردت وضع شيء بين علامة اقتباس مثلا اكتب
print "he said \"I love perl\" ... "; ستطبع
he said "I love perl" ...
ولو كتبنا
print "he said "I love perl" ... ";
ستعطي خطأ لأن الإقتباس انتهى بعد he said
وليس ضرورياً أن تعرفها كلها إنما هذا الجدول كمرجع
ويمكن استخدام qq/.../ بدلا من علامة التنصيص المزدوجة
مثلا
print qq/I love perl/;
فعلامة التنصيص المفرد التي نسميها التنصيص القوي
تمنع عمليات التعويض عدا \' و \\
ويمكن استخدام q/.../ بدلا من علامة التنصيص المفرد
يمكنك أن تطبع المخرجات بطريقة مرتبة عن طريق printf
حيث نكتب أولا الهيئة التي سنطبع فيها ثم نكتب قائمة بالمتغيرات
وتكون الهيئة عبارة عن نص عادي
ولكن كل رمز % يتبعه رمز يوضع نوع المتغير انظر الجدول أدناه
|

|
| %i |
عدد صحيح بالنظام العشري
|
| %d |
أيضا عدد صحيح بالنظام العشري
|
| %o |
عدد صحيح بالنظام الثماني
|
| %x |
عدد صحيح بالنظام الست-عشري
|
| %f |
عدد نسبي (كسري) مثلا 1.5
|
| %e |
عدد كسري بالطريقة الهندسية
|
| %g |
تعني f أو e ايهما أصغر
|
| %s |
سلسلة نصية
|
| %% |
اشارة % حقيقية أي لا تأخذ شيء
|
وبينهما يمكن أن نحدد عرض وعدد الخانات العشرية مثلا
%+ 9.3f تعني عدد كسري عرضه الكلي 9
منازل بما في الذالك الفاصلة وما على يمينها (ضع مسافات إذا كان أقل من ذلك) منها 3 منازل عشرية
وسواء أكان موجب أم سالب اكتب اشارته.
أما %09.3f
تعني عدد كسري عرضه 9
منازل (ضع أصفار إذا كان أقل من ذلك) منها 3 منازل عشرية
ولا تكتب الإشارة إلا إذا كان سالباً.
عميات الجمع(+) والطرح(-) والضرب(*) القسمة(/)
تجري بالطريقة التقليدية
ولدينا أيضا عملية الرفع لقوة (**) وهي من اليمين إلى اليسار
أي أن 2**3**2 تعني 2**(3**2)
أي 29
هذا الجول يوضح ترتيب الأولويات
| الأولويات |
| -> |
member الوصول إلى عضو
| ltr |
| ++ -- |
الزيادة والنقصان بمقدار واحد
| N/A |
| ** |
رفع لقوة
| rtl |
| ! ~ \ + - |
العمليات المفردة السابقة
وهي على الترتيب
النفي المنطقي و المتممة الثنائية الأولى
والمؤشر وتحديد الإشارة(وليس الجمع أو الطرح)
| rtl |
| =~ !~ |
المطابقة ونفي المطابقة
| ltr |
| * / % x |
الضرب والقسمة وباقي القسمة والتكرار
| ltr |
| + - . |
الجمع والطرح وجمع النص
| ltr |
| << >> |
ازاحة لليمن واليسار في النظام الثنائي
| ltr |
| named unary |
الفحوصات السابقة المفردة مثل التي تفحص وجود ملف
-e file
| N/A |
| < > <= >= lt gt le ge |
المتباينات
| N/A |
| == != <=> eq nw cmp |
المقارنات
| N/A |
| & |
'و' بالنظام الثنائي
| ltr |
| | ^ |
عمليتا أو ،إما(أحدهما وليس كلاهما) بالنظام الثنائي
| ltr |
| && |
و المنطقية
| ltr |
| || |
أو المنطقية
| ltr |
| .. |
إلى مثلا 1..5
| N/A |
| (...)?expr:expr |
الشرط
| rtl |
| = += -= *= /=
%= **= .= x= &= |= ^= <<= >>= &&= ||=
|
الإحلال(المساواة) والقيام بعملية على نفس المتغير
| rtl |
| , => |
فاصلة بين تعابير(قيمتها هي آخر تعبير) وكلاهما نفس المعنى
| ltr |
| not |
النفي المنطقي
| rtl |
| and |
و المنطقية
| ltr |
| or xor |
أو المنطقية ، إما(أحدهما وليس كلاهما) المنطقية
| ltr |
#!/usr/bin/perl -w
# this is my 2nd perl program
$msg1="Wellcome to perl";
$msg2="This is my 2nd perl script";
printf ("%s\n%s\n",$msg1,$msg2);
$a=10.1;
$b=-7.2;
printf ("a = %g\n",$a);
printf ("b = %g\n",$b);
printf ("a + b = %g\n",$a+$b);
printf ("a - b = %g\n",$a-$b);
printf ("a * b = %g\n",$a*$b);
printf ("a / b = %g\n",$a/$b);
printf ("a to power b = %g\n",$a**$b);
#!/usr/bin/perl -w
$a=0; $b=0;
$a=<>; # get it from the @ARGV file(s) if no file then standard input
$b=<STDIN>; # get it from standard input
# note $a has \n to remove it
chomp($a);
# chop remove last char(it need not be a \n)
chop($b);
@arr=("elm1","elm2");
print "$arr[0]";
print "sure ? enter (y/n) (you need to press CR)"
getc; # get a char but need CR
push(@arr,"hanga","manga"); # add to end
$var=shift @arr ; # get 1st and remove it
unshift(@arr,"foo","bar"); # add to 1st
مثال يوضح كيف يمكن عمل برامج تطبيقية رسومية ب perl
#!/usr/bin/perl -w
use Gtk; # load the Gtk-Perl module
use strict; # a good idea for all non-trivial Perl scripts
set_locale Gtk; # internationalize
init Gtk; # initialize Gtk-Perl
# convenience variables for true and false
my $false = 0;
my $true = 1;
# widget creation
my $window = new Gtk::Window( "toplevel" );
my $button = new Gtk::Button( "Goodbye World" );
# callback registration
$window->signal_connect( "delete_event", \&CloseAppWindow );
$button->signal_connect( "clicked", \&CloseAppWindow );
# show button
$button->show();
# set window attributes and show it
$window->border_width( 15 );
$window->add( $button );
$window->show();
# Gtk event loop
main Gtk;
# Should never get here
exit( 0 );
### Callback function to close the window
sub CloseAppWindow
{
Gtk->exit( 0 );
return $false;
}
# END EXAMPLE PROGRAM
برنامج رسومي باستعمال Gtk2 يجمع رقمين
#!/usr/bin/perl -w
# the -w in last line for warnings
use Gtk2; # load the Gtk2-Perl module
use strict; # it makes perl more sensittive to errors
set_locale Gtk2; # internationalize
init Gtk2; # initialize Gtk-Perl
# convenience variables for true and false ,widly used
my $false = 0;
my $true = 1;
# widget creation
my $win = new Gtk2::Window( "Add two numbers" );
my $vbox1 = new Gtk2::VBox();
my $hbox1 = new Gtk2::HBox();
my $hbox2 = new Gtk2::HBox();
my $hbox3 = new Gtk2::HBox();
my $hbox4 = new Gtk2::HBox();
my $label1 = new Gtk2::Label("First Number: ");
my $label2 = new Gtk2::Label("Second Number: ");
my $label3 = new Gtk2::Label("Summation : ");
my $entry1 = new Gtk2::Entry();
my $entry2 = new Gtk2::Entry();
my $entry3 = new Gtk2::Entry();
my $btn1 = new Gtk2::Button( "Add" );
my $btn2 = new Gtk2::Button( "Exit" );
# put each widget in it's parent
$win->add( $vbox1 );
$win->add( $hbox1 );
$win->add( $hbox2 );
$win->add( $hbox3 );
$win->add( $hbox4 );
$vbox1->add( $hbox1 );
$vbox1->add( $hbox2 );
$vbox1->add( $hbox3 );
$vbox1->add( $hbox4 );
$hbox1->add( $label1 ); $hbox1->add( $entry1 );
$hbox2->add( $label2 ); $hbox2->add( $entry2 );
$hbox3->add( $label3 ); $hbox3->add( $entry3 );
$hbox4->add( $btn1 ); $hbox4->add( $btn2 );
# set widgets attributes
$win->set_resizable( $false );
$entry3->set_editable( $false );
# callback events registration
$win->signal_connect( "delete_event", \&Gtk2::main_quit );
$btn2->signal_connect( "clicked", \&Gtk2::main_quit );
$btn1->signal_connect( "clicked", \&do_sum );
# show window and it's childs
$win->show_all();
# Gtk2 event loop
main Gtk2;
# Should never get here
exit( 0 );
# function to add $entry1 and $entry2 and put them in $entry3
sub do_sum
{
$sum=0.0;
$sum=0.0+$entry2->get_text()+$entry2->get_text();
$entry3->set_text( $sum );
}
مثال يوضح كيفية عمل مواقع انترنت
#!/usr/bin/perl -w
use CGI qw(:standard);
# to output <html>
print(header());
# to output <header> <title> and body <body>
print(start_html(title=>"this is the title"));
print("<h2>Hello world </h2>");
print(end_html());
بعض الروابط
www.perl.org
www.perl.com
www.cpan.org
www.perldoc.com
www.pm.org
www.speakeasy.org/~cgire
www.cgi101.com
www.freeperlcode.com
www.tpj.com (the perl journal)
www.w3.org/cgi
www.activestate.com
http://perlgolf.sourceforge.net
|