فرض کنید رشتهای دارید که نمایانگر یک ماتریس از اعداد است. سطرها و ستونهای آن ماتریس را برگردانید.
حالا رشتهای را در نظر بگیرید که در آن خطوط جدید جاسازی شدهاند، مانند:
9 8 7
5 3 2
6 6 7
که نمایانگر این ماتریس است:
1 2 3
|---------
1 | 9 8 7
2 | 5 3 2
3 | 6 6 7
Code شما باید بتواند موارد زیر را بیرون بدهد:
سطرهای ماتریس نمونهی ما:
و ستونهای آن:
این اولین تمرینی است که در آن راهحل یک اسکریپت «main» نیست. هدف نوشتن کتابخانهای از توابع است که در دیگر برنامههای awk گنجانده شود. در این تمرین چند مفهوم تازه و جالب برای دیدن وجود دارد.
بخشهای زیر که با «(gawk)» برچسب خوردهاند، بهطور خاص افزونههای GNU awk هستند.
در این تمرین، دادهها را از یک فایل میخوانید، نه از جریان ورودی اصلی.
دربارهی getline در دفترچهی راهنمای GNU awk بخوانید، بهویژه شکلهای Getline/File و Getline/Variable/File.
آرایهی دوبعدی میتواند راهی برای پیادهسازی این راهحل باشد. GNU awk دو روش برای نمایش آن دارد:
به دستور @include در فایل تست توجه کنید.
این دستور به gawk میگوید فایل نامبرده را بخواند و ارزیابی کند.
همهی متغیرهای awk سراسریاند (بهجز پارامترهای تابع که محلیِ همان تابعاند).
احتمال برخورد نامها زیاد است، بهویژه وقتی کتابخانههای شخص ثالث گنجانده میشوند.
فضاهای نام روشی برای تفکیک محل ذخیرهی متغیرها هستند.
به دستور @namespace در فایلهای تمرین توجه کنید.
فضای نام پیشفرض «awk» نام دارد. داشتن یک فضای نام پیشفرض به برنامهنویس اجازه میدهد از داخل تابعی در فضایی نام دیگر، یک تابع توکار awk را فراخوانی کند.
پارامترهای آرایهای با ارجاع پاس داده میشوند. تغییراتی که تابع در آرایه ایجاد میکند، برای فراخوانیکننده قابل مشاهده است.
پارامترهای غیرآرایهای با مقدار پاس داده میشوند.
برای پارامترهای بدون نوع، به کاری بستگی دارد که تابع با آنها انجام میدهد:
جزئیات کامل در دفترچهی راهنما، در پاس دادن آرگومانهای تابع با مقدار یا با ارجاع آمده است.
متغیرهای محلیِ تابع را میتوان با استفاده از پارامترهای «پاس با مقدار» ساخت. پاس دادن مقدارهای کمتر از تعداد پارامترهای فهرستشده به یک تابع خطا نیست؛ پارامترهای اضافی تا زمانی که استفاده نشوند «بدون نوع» میمانند. میتوان در تابع به آنها مقدارهای اسکالری نسبت داد که در فضای نام سراسری ذخیره نمیشوند.
طبق قرارداد، در امضای تابع ابتدا پارامترهای مورد انتظار میآیند، سپس مقداری فاصله، و بعد پارامترهای محلی. برای مثال:
function add(a, b, total) {
# here, `typeof(total)` is "untyped"
total = a + b
# now, `typeof(total)` is "number"
return total
}
BEGIN {
sum = add(5, 10)
print sum # 15
print typeof(total) # untyped, meaning "total" is unused in this scope
}