Tipo de matriz asociativa

Una matriz asociativa es una correlación o tabla de búsqueda que consta de una colección de claves y sus valores asociados. Existe una correlación de uno a uno entre un conjunto de claves y valores. Las matrices asociativas están soportadas por Perl, ksh93y otros idiomas.

En Vue, cada correlación va de una o más claves (dimensiones) a un único valor. Las claves de matriz asociativa pueden tener los tipos siguientes
  • integral
  • coma flotante
  • serie
  • timestamp
  • Seguimiento de pila
  • vía de acceso
  • Dirección MAC
  • dirección IP
El valor de matriz asociativa puede tener los tipos siguientes
  • integral
  • coma flotante
  • serie
  • timestamp
  • Seguimiento de pila
  • vía de acceso
  • Dirección MAC
  • dirección IP
  • list de
  • range

Las matrices asociativas son tipos de datos abstractos en Vue.Las acciones siguientes se pueden realizar en tipos de datos de matriz asociativa.

  • Enlace de claves a un valor:

    Si la instancia de las claves todavía no existe, esta acción añade una clave o un conjunto de claves junto con el valor asociado a la matriz asociativa. De lo contrario, esta acción sustituye el valor antiguo asociado por el nuevo valor. Las claves que no están enlazadas tienen un valor predeterminado de 0 para el tipo numerical , un valor de serie vacío para el tipo string o un valor NULL para otros tipos de clave.

    El ejemplo siguiente explica las claves de enlace a un valor
    /* single key dimension */
    count["ksh"] = 1;
    /* multiple key dimensions */
    var[0][“a”][2.5] = 1;
    var[1][“a”][3.5] = 2;

    El primer uso de una variable de matriz asociativa establece el tipo de las claves, el tamaño de dimensión de clave y el tipo del valor. Debe permanecer igual en los demás lugares del script Vue .

    Para una clave en ASO, puede enlazar un valor LIST completando las siguientes acciones diferentes:

    1. Asignando una variable 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. Asignando una lista vacía devuelta por la función de constructor list() :
      assoc_array["ksh"]=list(); /* assigns an empty list */ 
    3. Añadiendo una lista o un valor integral
      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 */
  • Desenlace de una clave o un conjunto de claves y supresión del valor asociado: la función delete() se utiliza para eliminar claves y valores de enlace de la matriz asociativa. A una clave no enlazada se le asigna un valor de 0 o una serie vacía.
    El ejemplo siguiente explica cómo utilizar la función de supresión para desenlazar una clave
    delete(count, "ksh");
    delete(var, 0, “a”, 2.5);
    El primer argumento es el nombre de la variable de matriz asociativa. El nombre de variable de matriz debe ir seguido de N claves separadas por comas, donde N es el tamaño de dimensión de clave. Si sólo desea suprimir un valor asociado basándose en dimensiones clave distintas de N, puede especificar ANY para esa dimensión clave. Por ejemplo, para suprimir todos los elementos que tienen la serie "a" como segunda dimensión, especifique el mandato siguiente.
    delete(var, ANY, “a”, ANY);

    Todas las teclas de la función delete() se pueden especificar como ANY, en cuyo caso, se suprimirán todos los elementos de la matriz asociativa. Esta función devuelve 0 si se encuentran elementos coincidentes y se suprimen. De lo contrario, la función delete() devuelve un valor de 1.

  • Búsqueda del valor para un conjunto de claves: esta operación busca valores que están enlazados a una sola clave o a varias claves.

    total = count["ksh"] + count["csh"];
    prod = var[0][“a”][2.5] * var[1][“a”][3.5];

    Se puede recuperar un valor LIST para una clave indexando la matriz asociativa con la clave. Todas las funciones LIST, sum(), min(), max(), count()y avg(), se pueden utilizar en una lista de una matriz asociativa. También puede asignar una lista en matriz asociativa a una variable LIST.

    Ejemplo:
    /* 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"]) );  
  • Comprobación de si existe una clave o un conjunto de claves: la función exists() comprueba si la matriz asociativa tiene algún elemento que corresponda a las claves dadas. La función exists() devuelve un valor 1 si se encuentra un elemento y la función devuelve 0 si no se encuentra un elemento.
    El siguiente bloque de código comprueba si existe una clave o un conjunto de claves.
    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]);
    

    Si especifica la palabra clave ANY para una dimensión clave determinada, la dimensión pasa a ser insignificante para la operación de búsqueda. Todas las teclas de la función exists() se pueden especificar como ANY, en cuyo caso, la función exists() comprobará si la matriz asociativa tiene algún elemento o no.

    my_key = “a”;
    if (exists(var, ANY, my_key, ANY))
      printf(“Found element with second key as %s \n”, my_key);
    
  • Operación de incremento y decremento: Esta operación se puede utilizar para incrementar o disminuir los valores de matriz asociativa. Para utilizar esta operación, debe especificar un entero como tipo de valor para la clave. Los ejemplos siguientes muestran el uso de la operación de incremento y decremento:

  1. printf ("Valor aumentado = %d\n", + + count ["ksh"]);
  2. printf ("Valor aumentado = %d\n", count ["ksh"] + +);
  3. printf("Valor decrementado = %d", --count["ksh"]);
  4. printf ("Valor dementado = %d\n", count ["ksh"] --);

En el ejemplo 1, se imprime el valor que corresponde a la clave ksh , incrementado y el valor incrementado.

En el ejemplo 2, el valor que corresponde a ksh se imprime primero y, a continuación, se incrementa el valor. La operación de decremento funciona de la misma manera. Sin embargo, la operación de incremento o decremento sólo se puede realizar en matrices asociativas cuyo tipo de valor es entero. La operación de incremento o decremento también se puede utilizar como agregador, donde el tipo de valor de la matriz asociativa de forma predeterminada se establece como entero. Por ejemplo, al encontrar una sentencia, una [100] + + la primera vez, se crea la matriz asociativa a con el tipo de clave entera y el tipo de valor entero. El valor almacenado para la clave 100 es 1. Sin embargo, para a[100]--, -1 se almacenaría como valor de la clave 100. Al encontrar posteriores operaciones de incremento o decremento para la misma matriz asociativa, a se realizan operaciones de incremento y decremento en el valor de la clave especificada.

El comportamiento de incremento y decremento es exactamente el mismo para las matrices asociativas con más de una dimensión clave:
++var[0][“a”][2.5];
var[0][“a”][2.5]++;
--var[1][“a”][3.5];
var[1][“a”][3.5]--;
  • Imprimir contenido de una matriz asociativa: esta operación imprime la clave y el valor asociado de los elementos para una matriz asociativa. Puede especificar las siguientes opciones de impresión:
    Opción de impresión de matriz asociativa Descripción Valores posibles Valor predeterminado
    núm-de-entradas Especifica que se imprima el primer número de pares de clave-valor. n> =0. (Si es 0, se visualizan todas las entradas.) 0
    tipo-clasificación Especifica el orden de clasificación. SORT_TYPE_ASCEND, SORT_TYPE_DESCEND SORT_TYPE_ASCEND
    ordenar por Especifica si se debe ordenar en función de la clave o el valor. SORT_BY_KEY, SORT_BY_VALUE SORT_BY_KEY
    valor-lista Especifica qué atributo LIST debe ordenarse o cuantificarse cuando el valor de la matriz asociativa es el tipo de lista USE_LIST_SUM, USE_LIST_MIN, USE_LIST_MAX, USE_LIST_COUNT, USE_LIST_AVG USE_LIST_AVG
    índice-clave-clasificación Especifica el índice clave (dimensión), en función del cual se ordenará la salida. --1 o k, donde 0 <= k < número_de_claves 0
    stack-raw Especifica que se imprima el rastreo de pila en formato de dirección RAW. STKTRC_NO_SYM 0

    Cuando el distintivo de clasificación por es SORT_BY_KEY, SORT_BY_VALUE y la clave (proporcionada por el índice de clave de clasificación) y el par de valores es de un tipo en el que no se puede realizar la ordenación, la opción num-of-entries y otras opciones de impresión se aplican a la impresión del par de clave y valor individual, si procede. Por ejemplo, si la ordenación es por tipo de rango, la opción núm-de-entradas y las otras opciones de impresión se reservan para las ranuras de cada rango.

    Las opciones de impresión de matriz asociativa predeterminadas se pueden cambiar utilizando la función set_aso_print_options()en el analizador BEGIN.

    Ejemplo:
    set_aso_print_options (10, SORT_TYPE_DESCEND|SORT_BY_VALUE);

    Tal como se muestra en el ejemplo, se pueden proporcionar varios distintivos insertando un vertical bar symbol entre ellos.

    Nota: La función set_aso_print_options() no puede establecer la opción sort-key-index porque no se puede generalizar para matrices asociativas de distintos tamaños de dimensión clave.

    La función print() imprime las teclas y el valor asociado para todos los elementos o un subconjunto de elementos de la matriz asociativa utilizando las opciones de impresión predeterminadas. Para alterar temporalmente las opciones de impresión predeterminadas, debe utilizar argumentos adicionales en la función print() . Para obtener más información sobre la función print() , consulte el tema Funciones deVue .

    La función print() imprime los pares de clave y valor de la matriz asociativa utilizando las opciones de impresión predeterminadas. Si desea ver el contenido de la matriz asociativa en un formato diferente, proporcionará la opción num-of-entries y los distintivos de la opción de impresión como parámetros adicionales a la función print() .

    Ejemplo:

    /* 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]);
    
  • La rutina clear() se utiliza para borrar las claves y los valores asociados para los elementos de la matriz asociativa. La rutina clear() también se utiliza para restablecer el valor de la clave de matriz asociada sin borrar las claves. Si la subrutina clear() borra correctamente uno o más elementos, devuelve un 0 y la subrutina devuelve 1 cuando no se borra ningún elemento.
    clear(count);               // count is an associative array.
    La rutina anterior con sólo un argumento del tipo de matriz asociativa borra todos los pares de claves presentes en la matriz asociativa recuento. Después de la operación de borrado anterior, la matriz asociativa recuento está vacía.
    clear(count, RESET_VALUE);       // count is an associative array. 
    clear(var);          //  var is an associative array with three key dimensions
    La rutina de borrado anterior restablece el valor de todos los pares de claves en la matriz asociativa sin borrar la clave. El siguiente valor predeterminado se restablece basándose en el tipo de valor de la matriz asociativa:
    Para borrar elementos con claves específicas, debe especificar las claves en el primer argumento. Además, para ignorar cualquier dimensión clave en particular (todos los valores de esa coincidencia de dimensión clave en particular), puede especificar ANY. Si se especifican las claves, todas las dimensiones de clave de la matriz asociativa deben especificarse como valores genuinos del tipo de clave coincidente o ANY.
    clear(var[ANY][“a”][ANY]);  // clear all elements with second key as “a”
    Puede especificar un segundo parámetro en la rutina clear() como RESET_VALUE. Si especifica RESET_VALUE , las claves de la matriz asociativa se conservan y sólo se restablecen los valores.
    clear(count, RESET_VALUE);  
    clear(var[0][ANY][ANY], RESET_VALUE);
    

    El RESET_VALUE depende del tipo del valor. La tabla siguiente muestra los tipos de datos y los valores predeterminados a los que se restablece el tipo de datos:

    Tipo Valor predeterminado
    Tipos integrales (int, long, short, long long) 0
    lista Vacío
    Foat y double 0.0000000
    Serie Vacío
    Stktrace_t Vacío
    indicación_fechahora_probev_t 0
    vía_acceso_t Vacío
    mac_addr_t 0
    ip_addr_t 0
  • La operación Quantizeimprime las claves y los valores de la matriz asociativa dada en un formato gráfico basado en el escalado lineal de los valores.
    quantize(count);
    count es una matriz asociativa y muestra el contenido siguiente:
    key                  value
    1                     1             ========
    2                     2             =========
    3                     3             ==========
    4                     4             ===========
    5                     5             ============
    6                     6             =============

De forma similar a la función print() , puede proporcionar opciones de impresión de función quantize() para alterar temporalmente las opciones de impresión predeterminadas.

Ejemplo:

/* 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);
Para matrices asociativas con claves multidimensionales, las claves se pueden especificar en el primer argumento para restringir elementos específicos:
quantize(var[0][ANY][ANY]);  //quantize elements with first key as 0
  • Lquantize en matriz asociativa: esta operación imprime las claves y los valores de la matriz asociativa dada en formato gráfico basándose en el escalamiento logarítmico de los valores.
    lquantize (count);
    Donde count es una matriz asociativa imprimiría el siguiente contenido:
    key                    value
    500                     500           ====
    1000                   1000           ====
    2000                   2000           =====
    4000                   4000           =====
    8000                   8000           ======
    16000                 16000           ======
    32000                 32000           =======
    64000                 64000           =======

De forma similar a la función print() , puede proporcionar opciones de impresión de función lquantize() para alterar temporalmente las opciones de impresión predeterminadas.

Ejemplo:

/* 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);
Para matrices asociativas con claves multidimensionales, se pueden proporcionar claves en el primer argumento para restringir a elementos específicos:
lquantize(var[0][ANY][ANY]);  //lquantize elements with first key as 0

El ejemplo siguiente muestra cómo utilizar una matriz asociativa:

Ejemplo:

# 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();
}
Nota: De este modo, no es necesario definir varias variables de lista de forma explícita y seguir obteniendo las funciones completas de la lista con la ayuda de matrices asociativas.