Tcl – 配列(3) -arrayコマンド(1)-

配列は変数と同じようにsetコマンドで作成と要素の参照ができます。さらに詳細な操作をするコマンドとして、arrayコマンドが用意されています。

arrayコマンドは第一引数に指定するオプションによって、アクションが変わります。オプションには配列の作成、操作関連、検索関連のオプションとハッシュテーブルの統計情報を参照するオプションがあります。

この記事は配列の作成と操作に関連するオプション(set, exists, get, names, size, unset)の使い方を紹介します。

配列の作成 – set

[書式]

array set arrayName list

array setarrayNameの配列を作成します。listは、偶数の要素数で構成されている必要があります。list内の奇数番目の要素は配列変数の要素名(key)として扱われ、次の要素は、その要素の値として使用されます。

存在しない配列名と空のリストを指定した場合、要素が空の配列を作成します。

[使用例1]

% array set arr {0 11 1 12 2 13 3 14 4 15}
% parray arr
arr(0) = 11
arr(1) = 12
arr(2) = 13
arr(3) = 14
arr(4) = 15

% array set season {
    春 Spring
    夏 Summer
    秋 Autumn
    冬 Winter
}
% parray season
season(冬) = Winter
season(夏) = Summer
season(春) = Spring
season(秋) = Autumn

リストが短い場合は1行で記載できますが、長くなる場合は、「{」で改行してkeyと値のペアを1行ずつ記載することも出来ます。要素名(key)には日本語も使用できます。

[使用例2]

% array set noName {}
% parray noName

% set noName abc
can not set "noName": variable is array

% set noName(x) abc
abc
% parray noName
noName(x) = abc

存在しない配列名と空のリストを指定した場合、要素が空の配列変数を作成します。 配列変数なので、setコマンドで値を代入するには、要素名(key)を指定する必要があります。

配列の判別(真偽) – exists

[書式]

array exists arrayName

array existsは配列変数か、そうでないかを判別します。arrayNameが配列変数の場合は1を返します。スカラー変数(単純変数)または存在しない変数名の場合は0を返します。

[使用例]

% array set taro {age 25}
% array set noName {}
% set var abc
abc

% array exists taro
1
% array exists noName
1
% array exists var
0

要素名と要素値のリストを取得 – get

[書式]

array get arrayName ?pattern?

array getは要素名(key)と値(value)がペアになったリストを返します。ペアになった要素の順序は未定義です。

patternを指定しなかった場合、すべての要素のペアになったリストを返します。patternを指定した場合、パターンに一致する要素名(key)が含まれた要素名(key)と値(value)がペアになったリストを返します。

patternの指定はstringコマンドのオプション:matchのマッチング規則(グロブスタイル)を使用します。

arrayNameが配列変数でない場合、または配列に要素が含まれない場合は、空のリストを返します。

[使用例]

% array set season {
    spring 暖かい
    summer 暑い
    autumn 涼しい
    winter 寒い
}

# すべての要素がペアになったリストを返します。
% array get season
winter 寒い summer 暑い autumn 涼しい spring 暖かい

# 特定の要素のペアを返します。
% array get season autumn
autumn 涼しい

# 要素名に「er」を含む要素のペアになったリストを返します。
% array get season *er
winter 寒い summer 暑い

要素名のリストを取得 – names

[書式]

array names arrayName ?mode? ?pattern?

array namespatternに一致するすべての要素名(key)のリストを返します。modeは以下のいずれかです。

mode意味
-exactpatternと完全に一致するものを検索。
-globpatternにglobスタイルを使う。
-regexppatternに正規表現を使う。

modeを指定しない場合、デフォルトは「glob」です。

patternを省略すると配列内のすべての要素名(key)のリストを返します。patternに一致する要素名(key)がない場合、または、arrayNameが配列変数の名前でない場合は、空の文字列を返します。

[使用例]

% array set season {
    spring 暖かい
    summer 暑い
    autumn 涼しい
    winter 寒い
}

# 全ての要素名(key)のリストを返します。
% array name season
winter summer autumn spring

# 要素名に「er」を含む要素名のリストを返します。
% array name season -glob *er
winter summer

# 要素名に「er」を含まない要素名のリストを返します。
% array name season -regexp {^(?!.*er).+$}
autumn spring
% array name season -regexp {^(?!.*er).*$}
autumn spring

※グロブ形式と正規表現の説明は別のブログ記事で紹介しようと思います。まだ紹介していないので以下のページを参考にしてください。

https://ja.wikipedia.org/wiki/グロブ
https://ja.wikipedia.org/wiki/正規表現

配列の要素数を取得 – size

[書式]

array size arrayName

array sizeは配列の要素数を返します。arrayNameが配列変数の名前でない場合、0を返します。

[使用例]

% array set arr {0 11 1 12 2 13 3 14 4 15}

% array size arr
5
% array size var
0

配列または要素の削除 – unset

[書式]

array unset arrayName ?pattern?

array unsetpatternに一致する要素名(key)の要素を削除します。patternを省略するとarrayNameの配列全体を削除します。arrayNameが配列変数でなかったり、patternが一致する要素名がなくてもエラーになりません。このコマンドは常に空の文字列を返します。

[使用例1]

% array set season {
    spring 暖かい
    summer 暑い
    autumn 涼しい
    winter 寒い
}

% parray season
season(autumn) = 涼しい
season(spring) = 暖かい
season(summer) = 暑い
season(winter) = 寒い

% array unset season *er
% parray season
season(autumn) = 涼しい
season(spring) = 暖かい

[使用例2]

% array set arr {0 11 1 12 2 13 3 14 4 15}
% parray arr
arr(0) = 11
arr(1) = 12
arr(2) = 13
arr(3) = 14
arr(4) = 15

% array unset arr
% parray arr
"arr" isn't an array

コメント

タイトルとURLをコピーしました