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
|