トラック
/
AWK
AWK
/
演習
/
配列操作
配列操作

配列操作

上級

説明

基本的なリスト操作を実装しましょう。

関数型言語では、lengthやmap、reduceのようなリスト操作がよく使われます。既存の関数を使わずに、一連の基本的なリスト操作を実装してみましょう。

実装する操作の正確な数や名前は、既存の名前との衝突を避けるため、トラックによって異なります。ただし、一般的には次のような操作を実装します。

  • append(2つのリストが与えられたとき、2つ目のリストのすべての要素を1つ目のリストの末尾に追加します)。
  • concatenate(一連のリストが与えられたとき、すべてのリストの要素を1つの平坦なリストにまとめます)。
  • filter(述語とリストが与えられたとき、predicate(item)がTrueになるすべての要素のリストを返します)。
  • length(リストが与えられたとき、その中にある要素の総数を返します)。
  • map(関数とリストが与えられたとき、すべての要素にfunction(item)を適用した結果のリストを返します)。
  • foldl(関数・リスト・初期アキュムレーターが与えられたとき、各要素を左からアキュムレーターに畳み込みます(reduce))。
  • foldr(関数・リスト・初期アキュムレーターが与えられたとき、各要素を右からアキュムレーターに畳み込みます(reduce))。
  • reverse(リストが与えられたとき、元の要素をすべて逆順に並べたリストを返します)。

なお、畳み込み関数(foldl、foldr)に引数を渡す順序は重要です。

AWKの新しい概念

GNU awkのいくつかのおもしろい言語機能を復習したいときは、matrix演習の説明を参照してください。

動的な関数呼び出し

awkの関数はファーストクラスオブジェクトではありません。ほかの言語のように、関数そのものを渡し合うことはできません。 しかし、変数に関数の_名前_(文字列)を保持しておき、特別な@varname(args)記法を使ってその関数を呼び出すことはできます。 例を見てみましょう。

function greet(name) {
    print "Hello, " name
}
BEGIN {
    greet("John")       # => "Hello, John"

    f = "greet"
    f("Bill")           # => error
    @f("Bill")          # => "Hello, Bill"
}

これについては、Indirect Function Callsで説明されています。 これはgawkの拡張機能です。

GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
AWK Exercism

配列操作を始める準備はできましたか?

Exercismに登録すれば、3個のコンセプト92個の演習、そして本物の人間によるメンタリングとともに、AWKを学んでマスターできます。すべて無料です。

配列操作を深く掘り下げよう!

再帰の実践的な入門を楽しみつつ、配列操作の命令型・関数型の代替アプローチを探り、末尾呼び出し再帰とアキュムレーター関数を深掘りします。