إذا أُعطيت سلسلة نصية تمثّل مصفوفة من الأعداد، فأرجِع صفوف تلك المصفوفة وأعمدتها.
إذن، إذا أُعطيت سلسلة نصية مضمَّن فيها أسطر جديدة مثل:
9 8 7
5 3 2
6 6 7
وهي تمثّل هذه المصفوفة:
1 2 3
|---------
1 | 9 8 7
2 | 5 3 2
3 | 6 6 7
فينبغي أن يكون الكود الخاص بك قادرًا على إنتاج ما يلي:
صفوف مصفوفتنا في المثال:
وأعمدتها:
هذا أول تمرين لا يكون فيه الحل نصًا برمجيًا "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
}
سجّل في Exercism لتتعلّم وتتقن AWK عبر 3 مفاهيم92 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.