連想配列型
連想配列は、キーとその関連値の集合からなるマッピング・テーブルまたはルックアップ・テーブルです。 セット内のキーと値の間は 1 対 1 にマッピングされています。 連想配列は、Perl、ksh93、およびその他のいくつかの言語でサポートされます。
- 整数
- 浮動小数点
- ストリング
- タイム・スタンプ
- スタック・トレース
- パス
- MAC アドレス
- IP アドレス
- 整数
- 浮動小数点
- ストリング
- タイム・スタンプ
- スタック・トレース
- パス
- MAC アドレス
- IP アドレス
- リスト
- range
連想配列は、 Vueの抽象データ型です。連想配列データ・タイプに対して以下のアクションを実行できます。
値へのキーのバインディング:
キーのインスタンスがまだ存在していない場合、このアクションで、キーまたはキー・セットが関連の値と共に連想配列に追加されます。 存在している場合は、このアクションで、関連付けられている古い値が新しい値に置き換えられます。 バインドされていないキーのデフォルト値は、
numericalタイプの場合は 0、stringタイプの場合は空の文字列値、その他のキー・タイプの場合はNULL値です。以下の例は、値へのキーのバインディングを示しています。/* single key dimension */ count["ksh"] = 1; /* multiple key dimensions */ var[0][“a”][2.5] = 1; var[1][“a”][3.5] = 2;連想配列変数の最初の使用により、キーのタイプ、キー・ディメンション・サイズ、および値のタイプを設定します。 これは、 Vue スクリプト内の他のすべての場所で同じままでなければなりません。
ASO のキーについては、次のアクションのいずれかを行うことによって LIST 値をバインドできます。
- LIST 変数を割り当てる方法:
assoc_array["ksh"]=ll /* copies ll list into associative array */ assoc_array["ksh"]=assoc_array["abc"]; /* copies a list in ASO to another list in ASO. Here the value type of assoc_array is LIST */ - list() コンストラクター関数によって返される空のリストを割り当てる方法:
assoc_array["ksh"]=list(); /* assigns an empty list */ - list 値または整数値を付加する方法
append(assoc_array["ksh"], 5); /* integral value 5 is appended to the list in ASO */ append(assoc_array["ksh"], ll); /* appends the contents of LIST variable ll to the list in ASO*/ append(assoc_array["ksh"], assoc_array["abc"]); /* appends the contents of list in ASO to another list in ASO */
- キーまたはキー・セットのアンバインディングおよび関連値の削除: 連想配列からキーおよびバインディング値を削除するには、delete() 関数を使用します。 アンバインドされたキーには、値 0 または空ストリングが割り当てられます。以下の例は、delete 関数を使用してキーをアンバインディングする方法を示しています。
delete(count, "ksh"); delete(var, 0, “a”, 2.5);最初の引数は、連想配列変数の名前です。 配列変数名の次には N 個のコンマ区切りキーが続いていなければなりません。ここで、N はキー・ディメンション・サイズです。 N 以外のキー・ディメンションに基づいて関連値の削除のみを行うには、キー・ディメンションにANYを指定できます。 例えば、2 番目のディメンションとしてストリング「a」を持つすべてのエレメントを削除するには、以下のコマンドを入力します。delete(var, ANY, “a”, ANY);delete()関数内のすべてのキーをANYとして指定することができます。この場合、連想配列のすべてのエレメントが削除されます。 一致するエレメントが検出され、削除されると、この関数は 0 を返します。 それ以外の場合、delete()関数は 1 を返します。 キー・セットの値の検出: この演算では、単一のキーまたは複数のキーにバインドされた値を検索します。
total = count["ksh"] + count["csh"]; prod = var[0][“a”][2.5] * var[1][“a”][3.5];キーの LIST 値は、連想配列にキーを索引付けすることにより取り出すことができます。 連想配列のリストでは、すべての LIST 関数、つまり
sum()、min()、max()、count()、およびavg()を使用できます。 連想配列内のリストを LIST 変数に割り当てることもできます。例:/* copies associative array list into list variable "ll" */ ll=assoc_array["ksh"]; /* prints the sum of all elements of list in associative array indexed with ksh" */ printf("sum of assoc_array %d\n",sum(assoc_array["ksh"]) ); /* prints the minimum value */ printf("min of assoc_array %d\n",min(assoc_array["ksh"]) ); /* prints the maximum value */ printf("max of assoc_array %d\n",max(assoc_array["ksh"]) ); /* prints the number of values in list */ printf("count of assoc_array %d\n",count(assoc_array["ksh"]) ); /* prints average value of the list */ printf("avg of assoc_array %d\n",avg(assoc_array["ksh"]) );- キーまたはキー・セットが存在するかどうかの検査:
exists()関数は、特定のキーに対応するエレメントが連想配列に含まれているかどうかを検査します。exists()関数は、エレメントを検出すると 1 を返し、検出しなかった場合は 0 を返します。以下のコード・ブロックでは、キーまたはキー・セットが存在するかどうかを検査します。if (exists(count, "ksh")) printf("Number of ksh calls = %d\n", count["ksh"]); if (exists(var, 0, “a”, 2.5)) printf(“Found value = %d\n”, var[0][“a”][2.5]);特定のキー・ディメンションについて
ANYキーワードを指定すると、そのディメンションは検索操作にとって無意味になります。exists()関数内のすべてのキーをANYとして指定することができます。この場合、exists()関数は、連想配列にエレメントが含まれているかどうかを検査します。my_key = “a”; if (exists(var, ANY, my_key, ANY)) printf(“Found element with second key as %s \n”, my_key);
増分/減分演算: この演算を使用して、連想配列値を増分または減分することができます。 この演算を使用するには、キーの値のタイプとして整数を指定する必要があります。 以下の例は、増分/減分演算の使用法を示しています。
- printf(“Incremented value = %d¥n”, ++count[“ksh”]);
- printf(“Incremented value = %d¥n”, count[“ksh”]++);
- printf(“Decremented value = %d¥n”, --count[“ksh”]);
- printf (“Decremented value = %d¥n”, count[“ksh”]--);
例 1 では、キー ksh に対応する値が増分され、その増分された値が出力されます。
例 2 では、ksh に対応する値がまず出力されてから、次に、その値が増分されます。 減分演算も同様に働きます。 ただし、増分/減分演算は、値の型が整数である連想配列のみで実行できます。 増分演算または減分演算は、集約機能としても使用できます。この場合、連想配列の値の型は、デフォルトで整数として設定されます。 例えば、a[100]++ というステートメントが最初に検出されると、整数キー・タイプおよび整数値型を持つ連想配列 a が作成されます。 キー 100 に保管される値は 1です。 ただし、 [100]--の場合は、キー 100の値として -1 が保管されます。 同じ連想配列 a について後続の増分演算または減分演算が検出されると、指定されたキーの値に対して増分演算および減分演算が実行されます。
++var[0][“a”][2.5];
var[0][“a”][2.5]++;
--var[1][“a”][3.5];
var[1][“a”][3.5]--;- 連想配列の内容の出力: この演算は、連想配列のエレメントのキーおよび関連値を出力します。 以下の出力オプションを指定できます。
連想配列の出力オプション 説明 指定できる値 デフォルト値 項目数 (num-of-entries) 指定した数のキーと値を先頭から出力するよう指定します。 n>=0. ( 0の場合は、すべてのエントリーが表示されます。 ) 0 ソート・タイプ ソート順を指定します。 SORT_TYPE_ASCEND, SORT_TYPE_DESCENDSORT_TYPE_ASCENDソート順 キー順または値順のいずれでソートするかを指定します。 SORT_BY_KEY, SORT_BY_VALUESORT_BY_KEYリスト値 連想配列の値がリスト型の場合に、ソートまたは量子化にどの LIST 属性を使用するかを指定します。 USE_LIST_SUM, USE_LIST_MIN, USE_LIST_MAX, USE_LIST_COUNT, USE_LIST_AVGUSE_LIST_AVGソート・キー索引 キー索引 (ディメンション) を指定します。このキー索引に基づいて出力がソートされます。 -1 または k。ここで、0 <= k < number_of_keys 0 stack-raw これは、スタック・トレースをロウ・アドレス・フォーマットで出力することを指定します。 STKTRC_NO_SYM 0 ソート順フラグが
SORT_BY_KEY, SORT_BY_VALUEであり、キー (sort-key-index で指定) と値のペアがソートできないタイプである場合、num-of-entries オプションおよびその他の出力オプションが、個別のキーと値の対の出力に適用されます (適用可能な場合)。 例えば、ソートが範囲型順の場合、num-of-entries オプションおよびその他の出力オプションが各範囲のスロット用に予約されます。連想配列のデフォルトの出力オプションは、BEGIN プローブで関数 set_aso_print_options() を使用して変更できます。
例:set_aso_print_options (10, SORT_TYPE_DESCEND|SORT_BY_VALUE);この例が示すように、
vertical bar symbolを間に挿入すれば、複数のフラグを指定できます。注:sort-key-indexオプションは、キー・ディメンション・サイズが異なる連想配列に対して汎用化できないため、set_aso_print_options()関数で設定することはできません。print()関数は、デフォルトの出力オプションを使用して、連想配列のすべてのエレメントまたはエレメントのサブセットについてのキーと関連値を出力します。 デフォルトの出力オプションをオーバーライドするには、print()関数で追加の引数を使用する必要があります。print()関数について詳しくは、「 Vue 関数 」トピックを参照してください。print() 関数は、デフォルトの出力オプションを使用して、連想配列のキーと値の対を出力します。 連想配列の内容を別の形式で表示したい場合は、 num-of-entries オプションと印刷オプション・フラグを print() 関数の追加パラメーターとして指定します。
例:
/* uses default print options to display the contents of associative array ‘count’ */ print(count); /* prints the first 10 entries of sorted associative array ‘count’. Default sort-by and sort-type options are used */ print(count, 10); /* sorts the associative array ‘count’ in descending order of values and displays the first 10 entries of ‘count’ */ print(count, 10, SORT_BY_VALUE|SORT_TYPE_DESCEND); /* print elements which have first key as 0 */ print(var[0][ANY][ANY]);
clear()ルーチンは、連想配列のエレメントのキーおよび関連値をクリアするために使用します。clear()ルーチンは、キーをクリアせずに連想配列の値をリセットする場合にも使用します。clear()サブルーチンは、1 つ以上のエレメントを正常にクリアすると 0 を返し、クリアしたエレメントがない場合は 1 を返します。
連想配列型の 1 つの引数のみが指定された前述のルーチンは、連想配列 count にあるすべての鍵ペアをクリアします。 前述のクリア操作の後、連想配列 count は空になります。clear(count); // count is an associative array.
前述の clear ルーチンは、キーをクリアせずに、連想配列内のすべての鍵ペアの値をリセットします。 次のデフォルト値は、連想配列の値の型に基づいてリセットされます。clear(count, RESET_VALUE); // count is an associative array. clear(var); // var is an associative array with three key dimensions特定のキーを持つエレメントをクリアするには、最初の引数にそのキーを指定する必要があります。 また、特定のキー・ディメンション (その特定のキー・ディメンションに一致するすべての値) を無視するには、ANYを指定することができます。 キーを指定する場合、連想配列のすべてのキー・ディメンションに、一致するキー・タイプの純粋値か、またはANYを指定する必要があります。clear(var[ANY][“a”][ANY]); // clear all elements with second key as “a”clear()ルーチンの 2 番目のパラメーターにはRESET_VALUEを指定できます。RESET_VALUEを指定すると、連想配列のキーが保持され、値のみがリセットされます。clear(count, RESET_VALUE); clear(var[0][ANY][ANY], RESET_VALUE);RESET_VALUEは、値の型に依存します。 以下の表に、データ型と、データ型がリセットされたときのデフォルト値を示します。タイプ デフォルト値 整数型 (int、long、short、long long) 0 LIST 空 float および double 0.0000000 ストリング 空 stktrace_t 空 probev_timestamp_t 0 path_t 空 mac_addr_t 0 ip_addr_t 0
Quantize演算は、値の線形スケーリングに基づいて、指定の連想配列のキーと値をグラフィカル形式で出力します。
count は連想配列であり、以下の内容を出力します。quantize(count);key value 1 1 ======== 2 2 ========= 3 3 ========== 4 4 =========== 5 5 ============ 6 6 =============
print() 関数の場合と同様に、quantize() 関数のオプションを指定して、デフォルトの出力オプションを指定変更できます。
例:
/* sorts the associative array ‘count’ in descending order of values and displays
the first 10 entries of ‘count’ in graphical format*/
quantize(count, 10, _BY_VALUE|SORT_TYPE_DESCEND);
quantize(var[0][ANY][ANY]); //quantize elements with first key as 0- 連想配列での
Lquantize: この演算は、値の対数スケーリングに基づいて、指定の連想配列のキーと値をグラフィカル形式で出力します。
ここで、count は連想配列であり、以下の内容が出力されます。lquantize (count);key value 500 500 ==== 1000 1000 ==== 2000 2000 ===== 4000 4000 ===== 8000 8000 ====== 16000 16000 ====== 32000 32000 ======= 64000 64000 =======
print() 関数の場合と同様に、lquantize() 関数の出力オプションを指定して、デフォルトの出力オプションを指定変更できます。
例:
/* sorts the associative array ‘count’ in descending order of values, and displays
the first 10 entries of ‘count’ in graphical
format based on the logarithmic value*/
lquantize(count, 10, _BY_VALUE|SORT_TYPE_DESCEND);
lquantize(var[0][ANY][ANY]); //lquantize elements with first key as 0以下の例は、連想配列の使用方法を示します。
例:
# Trace all the alloc- related calls and store the entry
# Time in ‘entry_time’ associative array
#
@@uft:$__CPID:*:"/alloc/":entry
{
entry_time[get_function()]=timestamp();
}
#
# At exit, first check if entry for this function was traced
# If so, delete the entry time from ‘entry_time’ associative array
# To ensure that next time no action is taken on exit if entry was not traced.
@@uft:$__CPID:*:"/alloc/":exit
{
func =get_function();
if(exists(entry_time, func) )
{
append(time_taken[func],
diff_time(timestamp(),entry_time[func],MICROSECONDS));
delete(entry_time, func);
}
}
#
# Print the list attributes sum, min, max, count, and avg time taken in every
# Alloc function.
#
@@syscall:$__CPID:exit:entry
{
print(time_taken);
exit();
}