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";
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/.../
بدلا من علامة التنصيص المفرد
%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
#!/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
#!/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.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
<< السابق | كتاب لينكس الشامل | التالي >> |