Маємо рядок тексту (англ. string), який представляє матрицю чисел. Повернімо рядки та стовпці цієї матриці.
Отже, якщо маємо рядок тексту із вбудованими символами нового рядка, як ось:
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 вправи та справжнє наставництво від людей, і все це безкоштовно.