الصيغ الإعتيادية هي طريقة لمعالجة النصوص بسلاسة عن طريق إستعمال "أنماط". و يلعب النمط دور النموذج الذي نبحث عن مثيله في نص معين، بإمكاننا مثلا تعريف نمط يبحث عن كل الكمات التي تحتوي على 5 حروف و تبدأ بالحرف X. نشير من جهة أخرى لأن مصطلح "صيغة إعتيادية" هو ترجمة من الإنجليزية Regular expression او بإختصار regexp، بالفرنسية نتحدث عن Expression regulière او Expression rationnelle.

 

  1. شكل الكتابة

 

عموما تأخذ كتابة الصيغ الإعتيادية الشكل التالي : 

 

$var =~ function/motif/[replace/][options]

 

بحيث أن كل ما يوجد بين [] فهو إختياري عند الإستعمال، بينما ما يوجد خارجها إجباري. المكان function يأخذ القيمة m إذا تعلق الأمر بالبحث عن motif او s إذا تعلق الأمر بإستبدال motif و في هذه الحالة يصبح وضع replace في الخانة الموالية. الخانة options نحدد فيها خاصيات البحث أو الإستبدال كأن نشير لدعم التفريق بين الحروف اللاتينية الكبيرة و الصغيرة ( إستعمال الخاصية i ).

 

  1. البحث m

 

لنأخذ مثالا بسيطا نبحث فيه عن كلمة bayna في الجملة أدناه، لاحظوا أن النتيجة تختلف حسب إن حددنا الخاصية i او لا ( i من insensitive، بالفرنسية insensible à la casse):

 

my $texte = "the word Bayna means clear, this is the reason why we call it Bayna";


if( $texte =~ m/bayna/ ) # on n'utilise pas d'options
{
	print "« bayna » match\n";
}
else
{
	print "« bayna » no match :(\n";
}


if( $texte =~ m/bayna/i ) # on n'utilise pas d'options
{
	print "« bayna » match with i option\n";
}
else
{
	print "« bayna » no match with i option :(\n";
}

 

 

لتكون النتيجة

 

C:\sbin>functions.pl
½ bayna ╗ no match :(
½ bayna ╗ match with i option

 

  1. الإستبدال s

 

سنستعمل نفس الجملة في المثال أعلاه، لنقوم بإستبدال Bayna بbayna ( بدون حرف كبير)

 

my $texte = "the word Bayna means clear, this is the reason why we call it Bayna";

my $copy_texte1=$texte;
my $copy_texte2=$texte;

$copy_texte1 =~ s/Bayna/bayna/; 
$copy_texte2 =~ s/Bayna/bayna/g; 

print $copy_texte1." : no option used\n";
print $copy_texte2." : option g (global)";

 

لتكون النتيجة :

 

C:\sbin>functions.pl
the word bayna means clear, this is the reason why we call it Bayna : no option used
the word bayna means clear, this is the reason why we call it bayna : option g ( global)

 

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

 

  1. كتابة النماذج

 

في المثالين التمهيديين أعلاه، إكتفينا بكلمات عادية كنموذج ( كملة bayna )، لكن بإمكاننا إستعمال رموز خاصة للتدليل على فئة معينة من الكلمات. 

 

  1. قائمة الرموز الخاصة

 

في الجدول أدناه قائمة ببعض الرموز الخاصة يقابلها شرح للدور الذي تلعبه:

 

مثال الشرح الرمز
m/b...a/ تعوض أي حرف، في المثال المقابل نبحث عن الكلمات من 4 احرف تبتدئ ب b و تنتهي ب a  .
m/[0-9]/ تنحدث عن فئة حروف، في المثال المقابل نبحث عن رقم [...]
m/[^0-9]/ تنحدث عن مقابل فئة حروف، في المثال المقابل نبحث عن حرف مهما كان إلا رقما. [^...]
  هذا الرمز يعني بداية السطر، أو بداية المتغير. ^
m/^$/ هذا الرمز يعني نهاية السطر، أو نهاية المتغير. في المثال نبحث عن السطور الفارغة  $
m/one|two/ و تعني "أو". في المثال المقابل نبحث عن one او two |
m/c*/ تكرار الحرف السابق 0 مرة أو أكثر *
m/c+/ تكرار الحرف السابق 1 مرة أو أكثر +
m/c?/ تكرار الحرف السابق 0 مرة أو 1 مرة ?
m/c{2,5}/ كتعميم للرموز الثلاثة السابقة؛ تكرار الحرف السابق بين n و m مرة {n,m}
m/c{,5}/ تكرار الرقم السابق بين 0 و X مرة {,m}
m/c{2,}/ تكرار الرقم السابق n مرة او اكثر {n,}

 

 

 

 

  1. فئات الحروف

 

فئات الحروف تمكن من الإشارة لحرف واحد من مجموعة معينة من الحروف؛ و كما سبقت الإشارة في الجدول السابق، تكتب فئة الحروف بين [ ].  في الجدول أدناه بعض فئات الحروف المهمة للإستعمال:

 

مثال الشرح الفئة
m/[a-z]/ أحد الحروف من a الى z [a-z]
m/[a-zA-Z]/ أحد الحروف من a الى z أو أحد الحروف من A الى Z [a-zA-Z]
m/[0-9]/ رقم بين 1 و 9 [0-9]
m/[XP5]/  تعني X أو P أو 5.  [XP5]
m/[0-9-]/ رقم بين 1 و 9 أو الرمز - [0-9-]
  n\ مثلا تعني رجوع للسطر فيما f\ تعني القفز للصفحة الموالية [ \n\t\r\f]

 

  1. خاصيات البحث او الإستبدال

 

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

توجد خاصيات أخرى نذكر منها الخاصية m و التي تعني أننا نريد التطبيق على جميع الاسطر دفعة واحدة و ليس سطرا بسطر، بحيث ^ و $ يعنيان بداية و نهاية أي سطر و ليس المتغير ككل. مثال.

 

my $texte = "Search is on followed by end line 
is on
several lines";
 
if( $texte =~ m/is on$/m ) 
{
	print "YES";
}
else
{
	print "NO";
}