6.4 لغة البرمجة perl كتاب لينكس الشامل >>

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 حيث نكتب أولا الهيئة التي سنطبع فيها ثم نكتب قائمة بالمتغيرات وتكون الهيئة عبارة عن نص عادي ولكن كل رمز % يتبعه رمز يوضع نوع المتغير انظر الجدول أدناه

How printf works?
%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.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

<< السابق كتاب لينكس الشامل التالي >>