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

コマンドライン引数

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.page_allocator };
    defer arena.deinit();

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

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

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

Chapter 1

Chapter 2

Chapter 3

Chapter 4

Chapter 5

Chapter 6

Chapter 7

Chapter 8

Chapter 9

Chapter 10

Chapter 11

Chapter 12

Chapter 13

Chapter 14

Chapter 15

Appendix

Error Explanation

☰ 人の生きた証は永遠に残るよう ☰
Copyright © 2018-2020 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.