連想配列型

連想配列は、キーとその関連値の集合からなるマッピング・テーブルまたはルックアップ・テーブルです。 セット内のキーと値の間は 1 対 1 にマッピングされています。 連想配列は、Perl、ksh93、およびその他のいくつかの言語でサポートされます。

Vueでは、各マッピングは 1 つ以上のキー (ディメンション) から単一値へのマッピングです。 連想配列キーには、以下のタイプがあります。
  • 整数
  • 浮動小数点
  • ストリング
  • タイム・スタンプ
  • スタック・トレース
  • パス
  • 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 値をバインドできます。

    1. 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 */ 
    2. list() コンストラクター関数によって返される空のリストを割り当てる方法:
      assoc_array["ksh"]=list(); /* assigns an empty list */ 
    3. 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);
    
  • 増分/減分演算: この演算を使用して、連想配列値を増分または減分することができます。 この演算を使用するには、キーの値のタイプとして整数を指定する必要があります。 以下の例は、増分/減分演算の使用法を示しています。

  1. printf(“Incremented value = %d¥n”, ++count[“ksh”]);
  2. printf(“Incremented value = %d¥n”, count[“ksh”]++);
  3. printf(“Decremented value = %d¥n”, --count[“ksh”]);
  4. 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_DESCEND SORT_TYPE_ASCEND
    ソート順 キー順または値順のいずれでソートするかを指定します。 SORT_BY_KEY, SORT_BY_VALUE SORT_BY_KEY
    リスト値 連想配列の値がリスト型の場合に、ソートまたは量子化にどの LIST 属性を使用するかを指定します。 USE_LIST_SUM, USE_LIST_MIN, USE_LIST_MAX, USE_LIST_COUNT, USE_LIST_AVG USE_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 を返します。
    clear(count);               // count is an associative array.
    連想配列型の 1 つの引数のみが指定された前述のルーチンは、連想配列 count にあるすべての鍵ペアをクリアします。 前述のクリア操作の後、連想配列 count は空になります。
    clear(count, RESET_VALUE);       // count is an associative array. 
    clear(var);          //  var is an associative array with three key dimensions
    前述の clear ルーチンは、キーをクリアせずに、連想配列内のすべての鍵ペアの値をリセットします。 次のデフォルト値は、連想配列の値の型に基づいてリセットされます。
    特定のキーを持つエレメントをクリアするには、最初の引数にそのキーを指定する必要があります。 また、特定のキー・ディメンション (その特定のキー・ディメンションに一致するすべての値) を無視するには、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 演算は、値の線形スケーリングに基づいて、指定の連想配列のキーと値をグラフィカル形式で出力します。
    quantize(count);
    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: この演算は、値の対数スケーリングに基づいて、指定の連想配列のキーと値をグラフィカル形式で出力します。
    lquantize (count);
    ここで、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();
}
注: この方法では、複数のリスト変数を明示的に定義する必要はなく、連想配列を使用してリストの完全な関数を取得できます。