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.
- integral
- coma flotante
- serie
- timestamp
- Seguimiento de pila
- vía de acceso
- Dirección MAC
- dirección IP
- 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 tipostringo un valorNULLpara 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:
- 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 */ - Asignando una lista vacía devuelta por la función de constructor list() :
assoc_array["ksh"]=list(); /* assigns an empty list */ - 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 especificarANYpara 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 comoANY, 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óndelete()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()yavg(), 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ónexists()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
ANYpara 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ónexists()se pueden especificar comoANY, en cuyo caso, la funciónexists()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:
- printf ("Valor aumentado = %d\n", + + count ["ksh"]);
- printf ("Valor aumentado = %d\n", count ["ksh"] + +);
- printf("Valor decrementado = %d", --count["ksh"]);
- 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.
++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_DESCENDSORT_TYPE_ASCENDordenar por Especifica si se debe ordenar en función de la clave o el valor. SORT_BY_KEY, SORT_BY_VALUESORT_BY_KEYvalor-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_AVGUSE_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_VALUEy 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 symbolentre ellos.Nota: La funciónset_aso_print_options()no puede establecer la opciónsort-key-indexporque 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ónprint(). Para obtener más información sobre la funciónprint(), 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 rutinaclear()también se utiliza para restablecer el valor de la clave de matriz asociada sin borrar las claves. Si la subrutinaclear()borra correctamente uno o más elementos, devuelve un 0 y la subrutina devuelve 1 cuando no se borra ningún elemento.
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); // count is an associative array.
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:clear(count, RESET_VALUE); // count is an associative array. clear(var); // var is an associative array with three key dimensionsPara 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 especificarANY. Si se especifican las claves, todas las dimensiones de clave de la matriz asociativa deben especificarse como valores genuinos del tipo de clave coincidente oANY.clear(var[ANY][“a”][ANY]); // clear all elements with second key as “a”Puede especificar un segundo parámetro en la rutinaclear()comoRESET_VALUE. Si especificaRESET_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_VALUEdepende 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.
count es una matriz asociativa y muestra el contenido siguiente:quantize(count);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);
quantize(var[0][ANY][ANY]); //quantize elements with first key as 0Lquantizeen 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.
Donde count es una matriz asociativa imprimiría el siguiente contenido:lquantize (count);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);
lquantize(var[0][ANY][ANY]); //lquantize elements with first key as 0El 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();
}