ورود/ایجاد حساب کاربری
   منوی اصلی
· خانه
· لیست کاربران
· جستجو
· آمار مشاهدات
· آرشیو مقالات


- شرح
· راهنمای نویسندگان
· درباره ما

   همکاری با نشریه
در صورتی که مایل به همکاری با نشریه هستید، می‌توانید در لیست پستی نشریه عضو شده و در جریان امور قرار گیرید. برای اطلاعات بیشتر، اینجا کلیک کنید.

   کاربران
سردبیر
هیچ مدیر کمکی حاضر
همکاران
هیچ مدیر کمکی حاضر
اعضا:
جدیدترین:جدید امروز:0
جدیدترین:جدید دیروز:0
جدیدترین:مجموع:2471
جدیدترین:جدیدترین:
ufumenarayu
اعضا:حاضر
اعضا:اعضا:0
مهمان‌ها:مهمان‌ها:2
مجموع:مجموع:2
کاربران حاضر
هیچ کاربر حاضری وجود ندارد

   ورود کاربران




 


 برای ورود مشکل دارید؟
 ثبت نام کاربران جدید

آشنایی با awk بخش نهم

(733 مجموع کلمات موجود در متن)
(5419 بار مطالعه شده است)  نسخه چاپی

آشنایی با awk بخش نهم

فراخوانی توابع ایجاد شده توسط کاربر
فراخوانی یک تابع به معنای اجرای آن و انجام عملیاتی است که برای آن منظور طراحی شده است. روش فراخوانی یک تابع نوشتن نام آن به همراه آرگومان‌های مربوطه است. مثال زیر فراخوانی یک تابع را نمایش می‌دهد:

foo(x, “lose”, 4 * z)

هنگامی که یک تابع فراخوانی می‌شود، یک کپی از آرگومان‌های ارسالی، به آن بــه فــرستــاده می‌شــود. به این فرایند فراخوانی با مقــدار یا Call by value نیز اطـلاق می‌شود. امکــان ارسال متغییرها به عنوان آرگومان‌های توابع به سادگی امکان پذیر است:

foo = “bar”
z = myfunc(foo)

در صورتی که تابع myfunc مقدار متغییرهای محلی خود را تغییر دهد، این تغییر بر سایر متغییرها اثری نخواهد داشت. برای مثال در صورتی که:

function myfunc(foo)
{
print foo
foo = “zzz”
print foo
}

مقدار اولیه آرگومان foo تغییر داده نمی‌شود بلکه مقدار متغییر محلی foo تغییر داده می‌شود و این تغییر تنها از درون تایع قابل مشاهده است و نه از بیرون. برای مثال، کد نمونه زیر را در نظر بگیرید:

#!/usr/bin/awk -f
function myprint(num)
{
print num
num ="zzz"
print num
}
{
num="bar"
myprint(num)
print num
}

پس از اجرای تابع، خروجی آن به شکل زیر خواهد بود:

$ echo " " | ./myprint.awk
bar
zzz
bar

همانطور که می‌بینید، مقدار num تنها به صورت محلی و در داخل تابع myprint به zzz تغییر داده شده و از بیرون تابع، مقدار num حتی پس از اجرای تابع همچنان bar می‌باشد. این خصیصه فراخوانی با مقدار است.

هنگامی که آرایه‌ها به عنوان آرگومان‌های توابع ارسال می‌شوند، کپی نشده و به صورت مستقیم در اختیار بدنه تابع قرار داده می‌شوند. این حالت به فراخوانی با مرجع یا Call by reference موسوم است. بنابراین در این حالت تغییرات اعمال شده بر روی آرایه در درون بدنه اجرایی تابع، برای محیز بیرون از تابع نیز قابل مشاهده خواهد بود.

واژه Return
بدنه توابع ایجاد شده توسط کاربر می‌تواند حاوی کلمه Return باشد. همانند زبان‌های برنامه‌نویسی دیگر، از Return به منظور بازگرداندن مقادیر از تابع استفاده می‌شود. awk به صورت خودکار فرض می‌کند که در پایان تمامی توابع یک واژه Return بدون هیچ پارامتری قرار داده شده است. برای مثال به تابع زیر توجه کنید:

function maxelt(vec,   i, ret)
     {
          for (i in vec) {
               if (ret == "" || vec[i] > ret)
                    ret = vec[i]
          }
          return ret
     }

امکان فراخوانی این تابع با استفاده از تنها یک آرگــومان vec وجود دارد. مقادیر محلی i و ret به عنوان آرگــومان فرض نمی‌شوند ولی با این حال شما می‌توانید مقادیری بجای آنها نیز به تابع ارسال کنید. فضای خالی که قبل از i قرار داده شده، برای awk مشخص می‌کنــد کــه ایـن دو مقــدار را جــزء آرگومان‌های تابــع بــه حساب نیاورد. شما از همین روش می‌توانید در هنگام تعریف توابع خودتان استفاده کنید. خوب برنامه زیر را ببینید:

#!/usr/bin/awk -f
function maxelt(vec, i, ret){
for (i in vec) {
if (ret == "" || vec[i] > ret)
ret = vec[i]
}
return ret
} # Load all fields of each record into nums.
{
for(i = 1; i <= NF; i++)
nums[NR, i] = $i
} END{
print maxelt(nums)
}

این برنامه اعداد را از ورودی خوانده، آنها را در یک آرایه ذخیره کرده و آرایه را به تابع maxelt می‌فرستد. تابــع maxelt نیز بزرگنرین المان را باز می‌گرداند. برای مثال می‌توانید آنرا به صورت زیر اجرا کنید:

$ ls -l | awk '{print $5}' | ./maxelt.awk
126834688

و با کمی چاشنی، می‌توانید از آن برای پیدا کردن بزرگترین فایل یک دایرکتوری استفاده کنید:

$ ls -l | grep `ls -l | awk '{print $5}' | ./maxelt.awk`
-rw-r--r-- 1 alan alan 126834688 2006-04-29 23:43 systemrescuecd-x86-0.2.19.iso

ترجمه و اضافات: آلن باغومیان alan@technotux.com
منبع: http://linuxgazette.net/issue67/nazario.html ، GNU/Awk User's Guide

PDF Version

تمامی مطالب و مقالات این سایت تحت مجوز GNU FDL قرار دارند. بنابراین کپی و ایجاد تغییر در آنها مطابق شرایط این مجوز آزاد می‌باشد.