گزیر

::گاهنوشتهای حمیدرضا محمدی::



دربارهٔ من:

آخرین نظردهندگان:

مشترک شوید:

ایمیل خود را در جعبهٔ زیر وارد کنید و دکمهٔ اشتراک را بزنید.

جستجو:

Valid XHTML 1.0 Transitional RSS Feed

پرل

۸۶/۰۲/۱۱

پرل (واژه‌ای بر گرفته از حروف اوّل عبارت انگليسی به معنای زبان استخراج و گزارشگيری کاربردی) در اواسط دهه‌ی ۸۰ به وسيله‌ی لری وال که پيش از آن نيز معرّف چندين برنامه‌ی مهم برای يونيکس بود ايجاد شد. با ظهور وب در اوايل دهه‌ی ۹۰ پرل به يکی از زبانهای محبوب برای برنامه‌نويسی سی.جی.آی تبديل شد.

هدف اصلی پرل به گفته‌ی خالق آن “آسان کردن کارهای آسان و امکانپذير نمودن کارهای مشکل” است. زبانهای برنامه‌نويسی زيادی شما را وادار می‌کنند پيش از آن که به مسأله‌ای که می‌خواهيد آن را حل کنيد بپردازيد زمان غيرضروری زيادی را صرف انجام کارهايی بکنيد تا زبان را راضی نگه داريد. پرل به شما اجازه می‌دهد که بدون نگرانی در مورد چيزهايی مثل اختصاص حافظه و تعيين نوع متغيّرها کار خود را به انجام برسانيد.

پرل بهترين ويژگيهای زبانهای سی، بيسيک و چند زبان برنامه‌نويسی مشابه را همراه با دسته‌ای از ويژگيهای محبوب زبانهای اوک، سد و زبان اسکريپتی شل در خود دارد. در پرل “بيش از يک روش برای انجام يک کار وجود دارد”. اين شعار غيررسمی پرل است. اگر شما با بعضی ديگر از زبانهای برنامه‌نويسی آشنايی قبلی داشته باشيد بخت آن که بتوانيد با پرل (بدون نياز به تلاش زياد) برنامه‌نويسی کنيد زياد است.

زبان پرل مفسر دارد (کد آن به کد ماشين ترجمه نمی‌شود بلکه همواره برای اجرا به يک برنامه به نام مفسّر نيازمند است) و مفسّر آن تا کنون برای بسياری از سيستم عاملها در دسترس قرار گرفته است.

يک برنامه‌ی ساده

برای آشنايی با اصول اوّليّه‌ی پرل با يکی از ساده‌ترين برنامه‌های ممکن آغاز می‌کنيم:

برنامه‌ی ۱- يک برنامه‌ی ساده‌ی پرل:

[code lang=”perl”]
#! /usr/bin/perl
print “Look at all the camels!\n”;
[/code]

اين تمام برنامه است. برای اجرای آن تحت يونيکس کافی است آن را تايپ کنيد، آن را در فايلی با نام مثلا trivial.pl ذخيره کنيد و با استفاده از دستور chmod +x آن را اجرايی نموده نهايتا آن را اجرا کنيد.

امّا در مورد کد: خطی که با !# شروع می‌شود اصلا يک دستور پرل نيست. چرا که نويسه‌ی # در پرل همواره نشانه‌ی آغاز توضيحات است و در واقع پيامی برای برنامه‌ی پوسته (شل) می‌باشد و مکان برنامه‌ای که بايد اين فايل را به عنوان ورودی بپذيرد و آن را اجرا کند (در اينجا مفسّر پرل) توسّط آن مشخّص می‌گردد. امکان دارد پرل روی يک کامپيوتر در مسير داده شده قرار نداشته باشد مثلا در مسير متداول ديگری مثل usr/local/perl/ قرار گرفته باشد که در هر صورت بايد آن مسير جايگزين اين عبارت گردد. برای يافتن مکان پرل روی سيستمهای يونيکس از دستور which استفاده کنيد:
[code lang=”bash”]
which perl
[/code]

نکته: غالبا علامت !# را شِبنگ تلفظ می‌کنند که خلاصه‌ی دو کلمه‌ی شارپ (نام موسيقيايی نويسه‌ی #) و بنگ (نام ديگر علامت تعجّب) است.

خط دوم همان کاری را انجام می‌دهد که از نام دستور چاپ انتظار را داريد. اين خط متن داده شده را روی خروجی چاپ می‌کند. دنباله‌ی n\ به معنای رفتن به خط بعد است.

هر دستور پرل به يک ; ختم می‌شود. برای طول خط دستور و فضاهای خالی مابين دستورات پرل محدوديّتی وجود ندارد. نويسه‌ی # در هر جای خط قرار گيرد نشان دهنده‌ی آن است که ادامه‌ی خط يک توضيح است و مفسّر دستورات و يا عبارات بعد از آن را ناديده می‌گيرد. دو استثنا برای اين قانون وجود دارد اوّلی مربوط به زمانی است که اين نويسه مابين دو علامت و يا قرار داشته باشد (جزئی از يک رشته باشد) و دومی زمانی اتّفاق می‌افتد که اين نويسه به عنوان يک جداکننده در يک عبارت منظّم به کار رفته باشد.

يک بلوک کد همانند آنچه در يک حلقه يا در يک جمله‌ی شرطی به کار می‌رود با استفاده از علامتهای { و } مشخّص می‌شود.

به همراه پرل مستنداتی عرضه می‌شود که perlfunc ناميده می‌شود و شامل توضيحات مربوط به کلّيّه‌ی توابع پرل و نحوه‌ی استفاده از آنهاست. برای مشاهده‌ی اين مستندات کافی است در خط فرمان تايپ کنيد perldoc يا perlfunc و يا به آدرس اينترنتی http://www.cpan.org/doc/manual/html/perlfunc.html مراجعه کنيد.

متغيّرها و ساختارهای داده در پرل

پرل يک زبان “نوعياب ضعيف” است به اين معنی که در آن نيازی به تعيين نوع داده‌ای که در يک متغيّر خاص ذخيره خواهد شد نيست. می‌دانيم که در زبانی مثل سی شما مجبور هستيد که اعلان کنيد يک متغيّر خاص عدد صحيح (int)، نويسه‌ای (char)، يک اشاره‌گر (*) و يا هر نوع داده‌ی موجود ديگر است. حال آن که در پرل متغيّرها از نوعی هستند که نياز دارند باشند و زمانی که نياز به تغيير نوع باشد می‌توانيد اين کار را انجام دهيد.

انواع داده در پرل

سه نوع متغيّر در پرل وجود دارد: متغيّرهای مقداری، آرايه‌ها و هشها. به منظور برای مجزا کردن انواع داده از لحاظ نوع اعلان نويسه‌های متفاوتی برای مشخّص کردن هر نوع داده استفاده می‌شود.

متغيرهای مقداری

اين متغيّرها با نماد $ مشخّص می‌شوند همانند penguin$. اين متغيّرها می‌توانند عددی يا رشته‌ای باشند و نوعشان هر وقت که لازم باشد می‌تواند تغيير کند. اگر با يک متغيّر عددی همانند رشته‌ها رفتار شود آن متغيّر رشته‌ای خواهد بود. و اگر با يک متغيّر رشته‌ای مانند يک عدد رفتار شود اگر بتوان مقدار آن را به يک عدد تبديل کرد تبديل به يک متغيّر عددی با مقدار تبديل شده و در غير اين صورت احتمالا تبديل به يک متغيّر عددی با مقدار 0 خواهد شد. برای نمونه مقدار رشته‌ای با مقدار اوّليّه‌ی “76trobones” در صورتی که در محاسبات عددی به کار رود 76 و مقدار رشته‌ای با مقدار اوّليّه‌ی “polar bear” در موقعيّت مشابه 0 در نظر گرفته خواهد شد.

آرايه‌ها

اين متغيّرها با نماد @ مشخّص می‌شوند مانند fish@. يک آرايه فهرستی از مقادير است که با استفاده از يک عدد که به آن انديس گفته می‌شود و مقدار آن برای نخستين عنصر 0 می‌باشد به اعضای آن مراجعه می‌شود. چون متغيّرهای مقداری با استفاده از نماد $ مشخص می‌گردند يک عنصر خاص از يک آرايه نيز با استفاده از نماد $ مشخّص می‌گردد. برای نمونه [2]fish$ به سومين عنصر آرايه‌ی fish@ مراجعه می‌کند.

هشها

اين متغيّرها با نماد % نشان داده می‌شود مثل employee%. هش يا آرايه‌ی اشتراکی ليستی از زوجهای نام و مقدار است. مراجعه به عناصر در اين نوع متغيّرها به جای انديس با استفاده از نام آن عنصر صورت می‌گيرد. همانند آرايه‌ها از نماد $ برای مراجعه به يک عنصر خاص صورت می‌گيرد. برای نمونه {employee{name$ که مقدار متناظر با name بازگشت داده می‌شود. دو تابع keys و values برای کار با اين نوع متغيّرها کارامدند. تابع keys آرايه‌ای شامل تمام کليدها (نامها)ی يک هش را باز می‌گرداند و values آرايه‌ای شامل تمام مقادير هش ورودی. کد زِير تمام مقادير محيطی يونيکس را باز می‌گرداند. همانند تايپ دستور env:

برنامه‌ی ۲- نمايش مقادير هش env:

[code lang=”perl”]
foreach $keys ( keys %ENV) {
print “$key = $ENV{$key}\n”;
}
[/code]

متغيّرهای خاص

پرل تعداد زيادی متغيّر خاص دارد. اين متغيّرها اغلب نمادهايی شبيه به علائم فاصله‌گذاری دارند مانند _$، !$، [$ و برای کوتاه‌نويسی فوق‌العاده مفيدند. (_$ متغيّر پيش‌فرض است، !$ پيام خطايی است که از سوی سيستم عامل صادر شده و [$ عدد ويرايش پرل است.)

_$ احتمالا مفيدترين اين متغيّرهاست. اين متغيّر زمانی که آرگومان مورد انتظار ارائه نشود مورد استفاده قرار می‌گيرد. به عنوان نمونه کدهای زير يکسانند:

[code lang=”perl”]
chomp;
[/code]

 

[code lang=”perl”]
chomp($_);
[/code]

همچنين دو حلقه‌ی زِير همسانند:

[code lang=”perl”]
for $cow (@cattle) {
print “$cow says moo.\n”;
}
[/code]

 

[code lang=”perl”]
for (@cattle){
print “$_ says moo.\n”;
}
[/code]

برای دستيابی به فهرست کاملی از متغيّرهای خاص مستندات perlvar را که به همراه پرل عرضه می‌شود و يا معادل آنلاين آن را در آدرس http://www.cpan.org/doc/manual/html/pod/perlvar.html ملاحظه کنيد.

جملات شرطی: if/else و unless

پرل دارای دو عبارت شرطی if و unless است که بر خلاف هم عمل می‌کنند به اين صورت که if اجازه می‌دهد که يک بلوک کد اگر شرايط خاصی برقرار باشند اجرا می‌شود و علاوه بر آن اجازه‌ی کنترل جريان منطقی برنامه را به برنامه‌نويس می‌دهد اما unless در صورتی يک بلوک کد را اجرا می‌کند که شرايط خاصی برقرار نباشند.

if

نحو if/else به صورت زِير است:

[code lang=”perl”]
if (condition) {
statement or block of code
}
elsif (condition) {
statement or block of code
}
else {
statement or block of code
}
[/code]

condition می‌تواند هر عبارتی که مقدار true يا false برمی‌گرداند باشد.

نکته: درست (true) بودن در پرل به گونه‌ای تعريف می‌شود که ممکن است برای شما ناآشنا باشد. هر چيزی در پرل درست است غير از 0 (عدد ۰)، “0” (رشته‌ی شامل اين رقم)، “” (رشته‌ی تهی) و يک مقدار تعريف نشده. به اين نکته توجه داشته باشيد که حتّی رشته‌ی “00” هم يک مقدار true است زِيرا جزء هيچکدام از حالات فوق نيست.

statement يا block of code در صورتی که condition مقدار true بازگرداند اجرا می‌شود. برای نمونه برنامه‌ی ۳ از اين ساختار استفاده می‌کند:

برنامه‌ی ۳- if/elsif/else

[code lang=”perl”]
if ($favorite eq “chocolate”) {
print “I like chocolate too.\n”;
} elsif ($favorite eq “spinach”) {
print “0h, I don’t like spinach.\n”;
}else {
print “Your favorite food is $favorite.\n”;
}
[/code]

نکته: لری(طرّاح زبان پرل) يک زبانشناس است و به خاطر همين پرل روشهای اصطلاحی متعدّدی برای بيان چيزهايی که با زبان محاوره‌ای انگليسی رابطه دارند دارد. برای نمونه تکّه کد زِير:

[code lang=”perl”]
if ($name eq “Rich”) {
print “Hello, Rich!\n”;
}
[/code]

می‌تواند به صورت زير هم نوشته شود:

[code lang=”perl”]
print “Hello Rich!\n” if $name eq “Rich”;
[/code]

لری پرل را به صورت يک زبان طبيعی طرّاحی نمود. به اين خاطر اين زبان با ساير زبانهای برنامه‌سازی متفاوت است. روش معمول علم کامپيوتر کدنويسی با استفاده از کم‌ترين مجموعه از کلمات کليدی که تمامی مفاهيم ديگر از آنها ساخته می‌شوند می‌شوند می‌باشد. پرل از جانب ديگر مانند يک زبان طبيعی روشهای متعدّدی برای بيان يک چيز در اختيار می‌گذارد (TIMTOWTDI). همچنين همانند يک زبان طبيعی پرل از زمانی که مورد استفاده قرار گرفته پيشرفت کرده است. اگر افراد به يک تابع خاص يا نحو جديد نياز داشتند لری آن را به ويرايش بعدی اضافه کرد و اگر کسی از يک قابليّت خاص استفاده نمی‌کرد و يا همه از يک ساختار خاص نفرت داشتند آن قابليّت يا ساختار در ويرايشهای بعدی حذف شد.

unless

unless همانند if ولی با شرط عکس عمل می‌کند. unless يک عبارت يا بلوک کد را اگر يک شرط درست نباشد اجرا می‌کند.

[code lang=”perl”]
unless ($name eq “Rich”){
print “Go away, you’re not allowed in here!\n”;
}
[/code]

نکته: همانند قبل عبارت بالا را می‌توانيد به صورت زِير بيان کنيد:

[code lang=”perl”]
print “Go away!\n” unless $name eq “Rich”;
[/code]

اگر چه اين يک قانون نيست ولی می‌توانيد بخشهای مهم‌تر کد را در سمت چپ قرار دهيد تا خوانايی کد بيشتر شود.

ايجاد حلقه

ايجاد حلقه روشی برای انجام چندبارۀ يک کار است. يک نمونه‌ی ساده زمانسنج کاهنده‌ای است که در واقع يک کار را با فاصله‌ی زمانی يک ثانيه ۱۸۰ بار انجام می‌دهد.

ساختارهای ايجاد حلقه می‌توانند يا به صورت اجرای يک بلوک کد تا زمانی که يک سری شرايط خاص صادقند و يا اجرا روی کليه‌ی اعضای يک ليست با استفاده از آنها عنوان آرگومان عمل کنند.

پرل چهار ساختار برای ايجاد حلقه دارد که عبارتند از: while، foreach، for و until.

for

ساختار for يک يک بلوک کد را با توجّه به يک مجموعه شرايط خاص به صورت زِير اجرا می‌کند:

[code lang=”perl”]
for (start condition; end condition; increment function) {
statements(s)
}
[/code]

foreach

ساختار foreach يک بلوک کد را به ازای هر عضو يک ليست يا آرايه اجرا می‌کند:
[code lang=”perl”]
foreach $name (@names) {
print “$name\n”;
}
[/code]

دستکاری متغيّر حلقه (name$ در اين نمونه) اثر مستقيم روی آرايه دارد. حلقه‌ی بالا را با استفاده از متغيّر پيش‌فرض به صورت زِير نوشت:

[code lang=”perl”]
for (@names) {
print “$_ was here\n”;
}
[/code]

اين نحوۀ کد نويسی با وجود آن که باعث خلاصه‌نويسی می‌شود از ميزان خوانايی کد می‌کاهد.

نکته: foreach اغلب به صورت for خلاصه می‌شود.

while

while يک بلوک کد را تا وقتی که يک شرط خاص دارای ارزش true باشد تکرار می‌کند:

[code lang=”perl”]
while ($x<10) { print "$x\n"; $x++; } [/code]

توجّه داشته باشيد که شرط ياد شده می‌تواند هر چيزی که مقدار true يا false برمی‌گرداند مثلا يک تابع باشد:

[code lang=”perl”]
while (InvalidPassword($user, $password) ) {
print “You’ve entered an invalid password. Please try again.\n”;
$password = GetPassword;
}
[/code]

until

until نقطه‌ی مقابل while است. اين حلقه تا زمانی که يک شرط خاص ارزش false داشته باشد و به عبارت ديگر تا وقتی آن ارزش آن شرط true نشده است اجرا می‌گردد:

[code lang=”perl”]
until (ValidPassword($user, $password)) {
print “You’ve entered an invalid password. Please try again.\n”;
$password= GetPassword;
}
[/code]

عبارات منظّم

توانمنديهای مهم پرل در کار با متن و فايلها نمود پيدا می‌کند که با استفاده از کتابخانه‌ی regex (عبارات منظم) صورت می‌کند. اين کتابخانه انجام عملياتی مانند تطبيق الگوهای پيچيده و جايگزينی را به سادگی و با کارايی مناسب امکانپذير می‌کند.

برای نمونه تکّه کد زير رشته‌های bob و mary را در يک خط متن يافته و آنها را با رشته‌ی fred جايگزين می‌کند:

[code lang=”perl”]
$String =- S/bob|mary/fred/gi;
[/code]

جدول زير بدون ورود به جزئيات مفهوم تکّه کد بالا را روشن می‌کند:

جزء مورد نظر

توضيح مربوط به آن

$String =-

اين تطبيق الگو را بر مقدار متغيّر رشته‌ای با نام String$ اعمال می‌شود.

S

جايگزين شود.

/

ابتدای متنی که بايد جايگزين شود.

bob|mary

رشته‌های bob يا mary جستجو شوند. تطبيق روی رشته‌های مزبور حتی اگر زيررشته‌های يک رشته‌ی ديگر هم باشند انجام می‌پذيرد به اين معنی که رشته‌ی mary مثلا در رشته‌ی maryland شناسايی می‌گردد.

/

آخر رشته‌ای که بايد يافته شود و ابتدای رشته‌ای که بايد جايگزين موارد يافت شده شود.

fred

موارد يافت شده با رشته‌ی fred جايگزين شوند.

/

انتهای رشته‌ی جايگزين.

g

تطبيق به صورت عمومی (globally) صورت می‌گيرد. يعنی در هر کجای متن که تطبيق صورت گيرد و به تعداد ممکن جايگزينی انجام می‌شود.

i

متن مورد جستجو به بزرگ و کوچک بودن حروف حسّاس نيست به اين معنی که در جستجوی bob رشته‌های bob ،Bob و bOB يکسان فرض می‌شوند.

;

آخر خط کد را مشخّص می‌کند.

 

دستيابی به پوسته‌ی سيستم عامل

اين قابليّت پرل که آن را برای انجام وظايف مرتبط با مديريّت سيستم مناسب می‌سازد عبارت است از امکان اجرای دستورات (پوسته‌ی) سيستم عامل و دريافت خروجی آنها در داخل برنامه‌ی پرل. اين عمل با قرار دادن دستور مورد نظر در بين دو علامت ` صورت می‌گيرد (اين علامت با کليدی زده می‌شود که معمولا بالای کليد Tab قرار دارد، آن را با ‘ که همانند ” علامت نقل قول به حساب می‌آيد اشتباه نگيريد). به عنوان نمونه قطعه کد زير فهرست فايلهای موجود در دايرکتوری جاری را چاپ می‌کند:

[code lang=”perl”]
$curr_dir = ‘pwd’;
@listing = ‘ls -la’;
print “Listing for $curr_dir\n”;
foreach $file (@listing) {
print “$file”;
}
[/code]

روش ديگر انجام اين کار استفاده از پيمانه‌ی Shell است. به تکّه کد زير توجّه کنيد:

[code lang=”perl”]
use Shell qw(cp);
cp (“/home/httpd/logs/access.log”, “/tmp/httpd.log”);
[/code]

چند نکته‌ی ديگر

 

تابع chop

اين تابع آخرين نويسه‌ی ورودی خود را حذف می‌کند. در هنگام دريافت ورودی از خط فرمان اين تابع برای حذف نويسه‌ی خطّ جديد استفاده می‌شود. برای دريافت ورودی از خطّ فرمان (معمولا کاربردهای غير سی.جی.آی) از شکل زير استفاده می‌شود:

[code lang=”perl”]
$inputline = ;
[/code]

 

یک مقاله در مورد پرل این مقاله در واقع یک فصل از کتابی بوده در مورد لینوکس ردهت (کلاه قرمزی 😉 ) ویرایش ۶، مشخصات دقیق کتاب الان در دسترسم نیست، فقط یادم هست که فصول این کتاب توسط نویسندگان مختلفی نوشته شده بود و هر فصلش به یک مبحث لینوکس یا مرتبط با لینوکس می‌پرداخت که یک فصلش هم همین فصلی است که من ترجمه‌ی آن را آورده‌ام. این ترجمه را روی سایت رایگانی که پیش از این داشتم گذاشته بودم (یک کپی ازش هم اینجا هست). مشکلی که چند ماهی است پیش آمده این است که ارائه‌دهنده‌ی آن فضای رایگان دیگر خدمات خود را به صورت رایگان ارائه نمی‌دهد و سایتهای رایگان ثبت شده (از جمله سایت من) را غیرفعال کرده. به هر حال فکر کردم می‌توانم با نقل مجدد آن ترجمه در اینجا باعث شوم که زحمت آن موقعم زیاد هدر نرود! احتمالاً این مقاله با وجود قدیمی بودن هنوز هم به درد عده‌ای می‌خورد.






۱۵ نظر

سروش:

تاریخ: ۸۶/۰۲/۱۲ ساعت: ۹:۳۶

به اينجا هم نظري بيافكن! شايد جالب باشه!
http://www2.ruby-lang.org/en/20020101.html

حسين:

تاریخ: ۸۶/۰۲/۱۲ ساعت: ۱۵:۲۰

پرل خيلي خوب است، ما پرل را دوست داريم. پرل با اسب آمد…

Hessam:

تاریخ: ۸۶/۰۲/۱۲ ساعت: ۱۹:۳۰

بازم سلام این دفعه نمی خوام چیزی سفارش بدم می خوام نظرت رو درباره ی فتوبلاگم بپرسم آدرسش اینه:
http://www.flickr.com/photos/h-online
در ضمن این عکس ها را با گوشی sony ericsson مدل z530i گرفتم.

IQ:

تاریخ: ۸۶/۰۲/۱۲ ساعت: ۲۰:۳۱

I agree with Hossein.

منصوري زاده:

تاریخ: ۸۶/۰۲/۱۳ ساعت: ۱۰:۰۶

براي کار با Perl ابزار ActiveState Komodo بسيار مناسب است.

چکاوک:

تاریخ: ۸۸/۰۱/۲۹ ساعت: ۲۳:۴۹

عالی بود ممنون

behtaz:

تاریخ: ۸۸/۰۹/۱۴ ساعت: ۱۸:۱۲

hi tanx babate matlabi k gozashti akhe vaghean b darde man khord chon mozoe payan termam hastesh bazam mamnon.piroz o khoshhal bashi.bye

fati:

تاریخ: ۸۹/۰۸/۱۶ ساعت: ۲۰:۳۷

دست مریزاد… منم واسه یه پروژه کلاسی لازمش داشتم که اینجا حق مطلب رو شما ادا کردید. ممنون

ساره:

تاریخ: ۸۹/۰۸/۲۲ ساعت: ۹:۰۲

سلام خسته نباشید
خیلی عالی بود،ممنون
اگه میشه بگید کاربرد null چیه و آیا متغیرهای مقداری میتونن null بگیرن؟

آذین:

تاریخ: ۸۹/۰۸/۲۴ ساعت: ۱۷:۲۹

خیلی عالی بود من که خیلی کارم راه افتاد
موفق باشید

ستاره:

تاریخ: ۹۰/۰۲/۱۰ ساعت: ۱۷:۵۸

سلام.سایت خوبی داری .اطلاعات سایتتم بدک نی.مرسی

مرضیه:

تاریخ: ۹۰/۰۹/۲۵ ساعت: ۲۱:۴۷

سلام خسته نباشی به من یکی که خیلی کمک کردی

افسانه:

تاریخ: ۹۰/۱۰/۰۴ ساعت: ۱۰:۰۱

خیلی عالی بود ممنونم

بهاره:

تاریخ: ۹۰/۱۰/۲۶ ساعت: ۰:۳۰

سلام.بد نبود، ولی یه دید کلی در حد ۱۰ سطر می خواستم.ولی ممنون

ساجد:

تاریخ: ۹۰/۱۲/۲۰ ساعت: ۱۴:۴۷

با سلام
از مطالب خوبتون بسیار استفاده کردم خواهشمندم در صورت امکان اگر مطالب بیشتری دارید در اختیار اینجانب بگذارید ممنون

خروجی آر.اس.اس نظرات این نوشته:»

ارسال دنبالک:»

ارسال نظر برای این نوشته امکانپذیر نیست.