آشنایی با 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
|