オフィスアワーがそろそろ始まるよ!()

コマンドライン引数

Zenで作成したアプリケーションでコマンドライン引数を受け取る方法を説明します。

Zenではコマンドラインで与えられた引数は、std.processモジュールにある関数を使用して取得できます。

引数の値を表示する

まず、コマンドライン引数を受け取って、そのまま表示するプログラムを書いてみましょう。print_argsという新しいアプリケーションプロジェクトを作成します。

$ mkdir print_args && cd $_
$ zen init-exe

main.zenを次の内容に修正します。

examples/ch13-io/print_args/src/main.zen:1:14

const std = @import("std");
const heap = std.heap;

pub fn main() anyerror!void {
    var arena = heap.ArenaAllocator { .allocator = &heap.direct_allocator };
    defer arena.deinit();

    const args = try std.process.argsAlloc(&arena);

    std.debug.warn("number of args: {}\n", args.len);
    for (args) | arg | {
        std.debug.warn("{}\n", arg);
    }
}

まず、最初にコマンドライン引数を格納するメモリを確保するアロケータを準備しています。そして、std.process.argsAlloc(&arena)を呼び出します。argsAlloc関数は![][]u8 (8u2次元スライスのエラー共用体) の値を返します。メモリアロケーションに失敗した場合は、エラーが返ってきます。ここでは、メモリアロケーションエラーが発生するとプログラムが停止することとし、tryをつけて呼び出します。

残りのコードは受け取った引数を表示するためのものです。スライスの要素数はlenでアクセスできるため、受け取ったコマンドライン引数の数は、2次元スライスの要素数から取得できます。

では、ビルドして実行してみましょう。

$ zen build

# まずは引数なしで実行する
$ zen-cache/bin/print_args 
number of args: 1
zen-cache/bin/print_args

# 引数ありで実行する
$ zen-cache/bin/print_args these are args
number of args: 4
zen-cache/bin/print_args
these
are
args

取得した引数の最初の値は、zen-cache/bin/print_argsです。これはアプリケーションバイナリの名前です。プログラム内から、自身の名前にアクセスしたい時に利用します。この値は、ヘルプメッセージでプログラムの利用方法を出力したい場合などに便利です。

各コマンドライン引数を変数として扱えるようにするには、次のようにします。

examples/ch13-io/print_args/src/main.zen:15:19

    const name = args[0];
    const first = args[1];
    const second = args[2];
    std.debug.warn("app name: {}, first arg: {}, second arg: {}\n",
        name, first, second);
}

実行すると、次の結果になります。

$ zen-cache/bin/print_args these are args
// ..
app name: zen-cache/bin/print_args, first arg: these, second arg: are

☰ 人の生きた証は永遠に残るよう ☰
Copyright © 2018-2019 connectFree Corporation. All rights reserved.
Zen, the Zen three-circles logo and The Zen Programming Language are trademarks of connectFree corporation in Japan and other countries.