السلام عليكم
التطبيقات إن شاء الله ستشمل الدروس من الأول للخامس. سينقسم الموضوع إلى عدة تطبيقات لكل تطبيق مستواه 
التطبيقات هي كالتالي:
- آلة حاسبة: السكربت يجب أن يحتوي على العمليات الحسابيه التالي: + - * / **. السكربت عند تشغيله يجب أن يطبع header يحتوي على :
تطبيق أول:
ثم يطلب الرقم المدخل الأول ثم الoperator (+ - * / ...) ثم الرقم المدخل الثاني و بعد طباعة الناتج يعود لطلب إدخال الرقم الأول.
و تطبيق ثاني:
أن يآخذ الرقم الأول و الoperator و الرقم الثاني من الcommand line و يطبع مع الheader طريقة التشغيل.
مثال لتطبيقي أنا:
الأول:
الثاني:
- أداة cat : الأداة مثل الأمر cat تقرأ جميع الملفات المعطاه من الcomand line مع طبع إسم كل ملف. و في حال عدم كاتبة أي ملف يطبع طريقة الإستخدام
تطبيقي:
hints: الarray ARGV هي لقرائة المعطيات من الcommand line. للقرائة يمكننا إستعمال الopen function . و للطباعة الprint function.
// الدروس التالية تطبيقاتها سترفق معها إن شاء الله
//
عند الإنتهاء من كتابة أي سكربت يرجى إرساله برسالة خاصة. سيتم وضع سكربتات كل الأعضاء بعد إنتهاء الجميع إن شاء الله.
الحلول وصلت ل:
للتطبيق الأول من:
UzunDz
للتطبيق الثاني من:
UzunDz
للتطبيق الثالث من:
UzunDz
---- الحلول
التطبيق الأول:
الحل:
كود:
print q(
+ simple perl calculator
+ @sec4ever
);
a:
print "first number: ";
$fnum = <stdin>;
chomp($fnum);
print "operator: ";
$op = <stdin>;
chomp($op);
print "second number: ";
$snum = <stdin>;
chomp($snum);
$op eq "+" ? $result = $fnum+$snum : die "Operator $op is not suported";
$op eq "*" ? $result = $fnum*$snum : die "Operator $op is not suported";
$op eq "-" ? $result = $fnum-$snum : die "Operator $op is not suported";
$op eq "/" ? $result = $fnum/$snum : die "Operator $op is not suported";
$op eq "**" ? $result = $fnum**$snum : die "Operator $op is not suported";
print "result: $result\n";
goto a;
التحليل:
في البداية طبعنا :
+ simple perl calculator
+ @sec4ever
عبر الأمر print
ثم وضعنا ركيزة للgoto loop
a:
ثم أخذنا المعطيات و حفظناها في متغييرات عبر:
print "first number: ";
$fnum = <stdin>;
chomp($fnum);
print "operator: ";
$op = <stdin>;
chomp($op);
print "second number: ";
$snum = <stdin>;
chomp($snum);
ثم وضعنا للتحقق إن كانت الoperator مدعومة من قبل الأداة و إلا بسيطبع خطأ و يخرج:
$op eq "+" ? $result = $fnum+$snum : die "Operator $op is not suported";
$op eq "*" ? $result = $fnum*$snum : die "Operator $op is not suported";
$op eq "-" ? $result = $fnum-$snum : die "Operator $op is not suported";
$op eq "/" ? $result = $fnum/$snum : die "Operator $op is not suported";
$op eq "**" ? $result = $fnum**$snum : die "Operator $op is not suported";
(هنا إستعملنا نوع من الif operator و هو : cond ? true : false)
ثم طبعنا الناتج عبر:
print "result: $result\n";
و أغلقنا الgo to loop عبر:
goto a;
الحل من UzunDz:
كود:
#UzunDz
print "[+] simple perl calculator\n[+] UzunDz\@sec4ever.com\n";
while (true){
print "first number :";
$n1 = <STDIN>;
print "operator :";
$op = <STDIN>;
print "seconde number :";
$n2 = <STDIN>;
print "result: ".eval($n1 .$op .$n2)."\n";
}
التحليل:
في البداية طباعة الهيدر عبر print :
print "[+] simple perl calculator\n[+] UzunDz\@sec4ever.com\n";
ثم إستعمل الinfinity loop أي هو لوب سيبقى يعمل إلى إغلاق الأداة فهو إستعمل condition دائما صحيح في الwhile loop :
while (true){
ثم طرب إدخال المعلومات و حفظها في متغييرات:
print "first number :";
$n1 = <STDIN>;
print "operator :";
$op = <STDIN>;
print "seconde number :";
$n2 = <STDIN>;
ثم طباعة الناتج (الeval تستعمل لتفيذ الoperator الموضوعه لها) عبر:
print "result: ".eval($n1 .$op .$n2)."\n";
ثم أغلق اللوب.
التطبيق الثاني:
الحل:
كود:
head();
$fnum = $ARGV[0];
$op = $ARGV[1];
$snum = $ARGV[2];
$op eq "+" ? $result = $fnum+$snum : "";
$op eq "*" ? $result = $fnum*$snum : "";
$op eq "-" ? $result = $fnum-$snum : "";
$op eq "/" ? $result = $fnum/$snum : "";
$op eq "**" ? $result = $fnum**$snum : "";
print "result: $result\n";
sub head {
print qq{
+ simple perl calculator
+ \@sec4ever
+ usage :
\t perl $0 firstnum operator secnum
\t ex: perl $0 10 * 2
}
}
طبعا مثل التطبيق الأول لكن هنا إستعمل subroutine بإسم head لكي يطبع لنا الheader
و أخذنا المعطيات من الcommand line عبر ال@ARGV
الحل من UzunDz:
كود:
#UzunDz
print "\n[+] simple perl calculator\n[+] UzunDz\@sec4ever.com\n";
print "[+] usage:\n\tperl $0 firstnum operator secnum\n\tex: perl $0 10 * 2";
$n1 = $ARGV[0];
$op = $ARGV[1];
$n2 = $ARGV[2];
print "\nresult: ".eval($n1 .$op .$n2)."\n";
الشيء نفسه
التطبيق الثالث:
الحل:
كود:
# perl cat
if(scalar(@ARGV) == 0)
{
print "+ usage: perl $0 file2.txt file2.txt ...";
}else{
for($i=0;$i<scalar(@ARGV);$i++)
{
print "+ reading ".$ARGV[$i]."\n";
open(cat,"<".$ARGV[$i]) or die $!;
while (<cat>) {
$line = $_;
chomp $line;
print $line."\n";
}
close cat;
}
}
التحليل:
في البداية وضعنا if statement لنرى إن كان يوجد شيء مدخل عبر الcommand line:
كود:
if(scalar(@ARGV) == 0)
{
كما نعمل فالscalar function تحتوي عدد المعطيات داخل الarray و هنا فحصنا في حال كان عدد المدخلات من الcommand line == 0 يطبع لنا طريقة الإستخدام:
print "+ usage: perl $0 file2.txt file2.txt ...";
إن لا (عبر else) أي في حال إدخال أي من الملفات وضعنا for loop لتمرر كل ملف لقرائته:
for($i=0;$i<scalar(@ARGV);$i++)
{
بدأنا من ال0 و حتا نصل لآخر ملف نزيد في كل مره 1 على المتغيير $i. ثم القرائة:
open(cat,"<".$ARGV[$i]) or die $!;
while (<cat>) {
$line = $_;
chomp $line;
print $line."\n";
}
close cat;
فتحنا الملف عبر open داخل "cat" قرأناه ثم أغلقناه عبر close
ثم أغلقنا الfor loop و الif statement.
الحل من UzunDz:
كود:
print "\n[+] simple file reader\n[+] UzunDz\@sec4ever.com\n"; #header
if(scalar(@ARGV) == 0){ # argv check
print "[+] usage:\n\tex: perl $0 file1.txt file2.txt ...";
}else{
for($i=0;$i<scalar(@ARGV);$i++)
{
# reading
print "\n[+] reading : $ARGV[$i]\n";
open (file, "<".$ARGV[$i]);
while($line = <file>)
{
print "\t".$line;
}
close file;
print "\n";
}
}
التحليل نفسه.
التطبيقات كانت سهلة و واضحة و كل شيء تم التطرق له في الدروس. أي إستفسار أو توضيح أتمنى وضعه في رد.
في أمان الله