3. 変数

 GlueLangでは、変数の型としてファイル変数と文字列変数が定義されています。

3.1. ファイル変数

 GlueLangではファイルを /etc/passwd のようなパスの文字列の他、変数として扱うことができます。次の例は変数 f を定義しており、 f はファイルとして振舞います。

Fig.: file1.glue

1
2
3
4
5
import PATH

file f = head -n 1 '/etc/hosts'   #/etc/hostsから1行読み込んでfに入力

cat f                             #fをcatで出力

この例のように、 f は「ファイル変数」と呼ばれます。ファイル変数は、コマンドに引数として渡すことができます。

3.2. 文字列変数

 文字列変数は str 名前 で定義します。次の例からは、上のfile1.glueと同じ出力が得られますが、 s の内容はGlueLang内のメモリに格納されます。

Fig.: str1.glue

1
2
3
4
5
import PATH

str s = head -n 1 '/etc/hosts'

echo s

3.3. where句

 特定の処理だけに使いたい変数は、where句の中に定義することで作ることができます。 次の例は、ファイルa, bをwhere句の中で定義してdiffで比較している例です。

Fig.: where.glue

1
2
3
4
5
6
7
import PATH

# "file a = ..." and "file b" = ... are evaluated before "diff a b"
diff a b !> echo 'different!!!'
  where
    file a = seq 10
    file b = seq 9

実行すると、後ろで定義したaとbがdiffで使えることが分かります。

1
2
3
4
$ glue ./where.glue
10d9
< 10
different!!!

 また、bashのコマンド置換の代わりに使うこともできます。 コマンドで作った長い文字列を別のコマンドの引数に渡すときに、すっきりした記述ができます。

Fig.: where_args.glue

1
2
3
4
5
6
import PATH

#passwdファイルの一番下のユーザの名前でpasswdファイルをgrepする
grep local.re '/etc/passwd'
  where
    str re = tail -n 1 '/etc/passwd' >>= awk '-F:' '{print $1}'

Macで実行した結果を示します。

$ glue ./where_args.glue
_wwwproxy:*:252:252:WWW Proxy:/var/empty:/usr/bin/false

3.3.1. where句まわりのスコープ

 where句の中で定義した変数等は、そのwhere句を持つジョブ内でのみ有効です。 次のコード例では、実行すると cat a でファイルaが存在しないとエラーが出ます。

  • Fig.: where_scope.glue
1
2
3
4
5
6
7
8
9
$ cat where_scope.glue
import PATH

diff a b !> echo 'different!!!'
  where
    file a = seq 10
    file b = seq 9

cat a
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
$ glue ./where_scope.glue
10d9
< 10
different!!!

Execution error at line 8, char 5
        line8: cat a
                   ^

        Variable a not found

        process_level 0
        exit_status 3
        pid 94404

 ジョブの外とwhere句の中に同じ名前の変数があるときは、 where句の中のものが優先されます。 ただし、別の名前をつけることを推奨します。 次の例は、ファイルaが二つ定義されています。

Fig.: where_scope2.glue

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import PATH

file a = seq 2

diff a b !> echo 'different!!!'
  where
    file a = seq 10
    file b = seq 9

cat a

ジョブの中では file a = seq 10 のファイルaが使われ、 外では file a = seq 2 の方が使われます。

1
2
3
4
5
6
$ glue ./where_scope2.glue
10d9
< 10
different!!!
1
2