آشنایی با awk بخش هشتم(516 مجموع کلمات موجود در متن) (4754 بار مطالعه شده است) آشنایی
با awk
بخش
هشتم
توابع
ایجاد شده توسط کاربر بسیاری
از برنامههای کاربردی پیچیده را میتوان
با ایجاد توابع سفارشی سادهتر کرد.
فراخوانی
توابع سفارشی کاملا مانند توابع درونی
صورت میگیرد.
تعریف
توابع سفارشی تعریف
توابع سفارشی میتواند در هر جایی از متن
یک برنامه awk
صورت
گیرد.
نیازی
نیست تا تابع را پیش از جایی که آنرا
فراخوانی میکنید، تعریف کنیـد.
دلیـل
ایــن امــر ایــن اسـت کــه awk
پیـش
از اجــرای برنـامـه، تمامی متن برنامه
را میخواند.
تعریف
یک تابع سفارشی به صورت زیر است:
function <VAR>name</VAR>(<VAR>parameter-list</VAR>) {
<VAR> body-of-function </VAR>}
name مشخص کننده نام تابع تعریف شده است. شیوه نامگذاری توابع مشابه نامگذاری متغییرهاست: ترکیبی از حروف و اعداد که بین آنها میتواند کاراکتر زیر خط قرار داشته باشد. نام تابع نمیتواند با عدد شروع شود. در درون یک برنامه awk، از یک نام تکراری فقط میتواند در یک تابع، آرایه یا متغییر استفاده کرد. به این معنی که نمیتوانید یک تابع یا متغییر یا آرایه همنام داشته باشید.
parameter-list لیستی از آرگومانهایی است که تابع میپذیرد. این آرگومانها باید با استفاده از کاما از هم جدا شوند. امکان داشتن دو آرگومان همنام یا داشتن آرگومان همنام با نام تابع وجود ندارد.
body-of-function یا بدنه تابع حاوی دستورات زبان awk میباشد.کار اصلی تابع در این بخش انجام میشود.
در استاندارد POSIX، تعریف یک تابع تنها با استفاده از کلمه کلیدی function صورت میگیرد. تقریبا تمامی انواع awk از این کلمه کلیدی پشتیبانی میکنند. بنابراین در صورتی که دوست دارید برنامهای سازگار (portable) بسازید، از این کلمه کلیدی برای تعــریف تابــع استــفاده کنید. برخــی از انواع awk از کلـمه کلیدی func نیز برای تعریف تابع پشتیبانی میکنند.
مثالهایی از توابع سفارشی در زیر مثالهایی از توابع سفارشی خواهید دید.
مثال نخست تابعی است با نام myprint که یک عدد را به عنوان آرگومان دریافت کرده و با فرمت خاصی چاپ میکند:
function myprint(num) { printf "%6.3g\n", num }
در صورتی که فایلی به نام nums حاوی خطوط زیر داشته باشید:
1.2 3.4 5.6 7.8
9.10 11.12 -13.14 15.16
17.18 19.20 21.22 23.24
و برنامه را به شکل زیر بنویسید:
#!/usr/bin/awk -f function myprint(num) { printf "%6.3g\n", num } { if($3 > 0){ myprint($3) } }
و آنرا با استفاده از دستور زیر اجرا کنید، خروجی مانند خروجی زیر بر روی صفحه نمایش مشاهده خواهید کرد:
$ cat nums | ./myprint.awk 5.6 21.2
برنامه ستون سوم فایل را خوانده، عدد منفی را در نظر نگرفته و سپس اعداد باقیمانده را مطابق تابع myprint فرمت کرده و بر روی خروجی چاپ میکند.
مثال دوم تابعی است که تمامی المانهای یک آرایه را پاک میکند:
function delarray(a, i) { for (i in a) delete a[i] }
همانطور که میبینید، این تابع دو آرگومان دریافت کرده و عملیات خود را انجام میدهد. البته دستور delete قابلیت پاک کردن تمامی المانهای یک آرایـه را نیـز داراسـت، ولـی استـفاده از آن بــه منظور پاک کردن آرایه، در برخی از انواع awk امکانپذیر نیست. به همین دلیل، در صورتی که قابلیت Portable بودن برنامهتان برای شما مهم است، توصیه میشود تا به این شکل از این تابع استفاده نکنید.
ترجمه
و اضافات:
آلن
باغومیان alan@technotux.com
منبع:
http://linuxgazette.net/issue67/nazario.html
،
GNU/Awk
User's Guide
PDF Version
|