Serie matemática, tome por ejemplo la secuencia consecutiva representada aquí como una matriz:
my @seq = my $a=0, {++$a} ... *;
for @seq[^10].kv {state $f=0; ($^k < 4 or $^k > 7) ?? say "a$^k = " ~ $^v !! (say "..." if $f ne 1; $f=1) };
Huellas dactilares:
a0 = 0
a1 = 1
a2 = 2
...
a8 = 8
a9 = 9
Mis preguntas: 1- ¿Hay una manera simple de eliminar solo el primer elemento, es decir, a0 = 0de la salida impresa?
2- ¿Podría este código hacerse más idiomático?
Gracias.

Respuestas:
Una solución básica
Comencemos con una solución muy simple para imprimir la esencia de una secuencia. No trata los detalles que ha agregado a su pregunta, pero es un buen punto de partida:
A diferencia
.kv, lo que convierte su invocante en la formakey1, value1, key2, value2, key3, value3, ..., es decir, 6 elementos si su invocante contiene 3 elementos,.pairsconvierte su invocante en la formakey1 => value1, key2 => value2, key3 => value3, ....Lo usé en
.pairslugar de en.kvparte porque significaba que podría usarlo».gistmás adelante en el código para obtener sin esfuerzo una buenakey1 => value1visualización de cada elemento. Lo modificaremos a continuación, pero este es un buen comienzo idiomático.Las llamadas
.heady.tailson la forma idiomática de crear pequeñas listas de los primeros y últimos N elementos de una lista de invocadores (siempre que no sea vago; más sobre eso en un momento).Dada esta solución inicial,
say seq-range-gist (0,1 ... Inf)[^10]muestra:A continuación, queremos poder "soltar solo el primer elemento ... de la salida impresa". Desafortunadamente
say seq-range-gist (0,1 ... Inf)[1..9]muestra:Queremos que el número a la izquierda del
=>retenga la numeración de la secuencia original. Para habilitar esto, dividimos la secuencia subyacente del rango que queremos extraer. Agregamos un segundo parámetro / argumento@range, y agregamos[@range]a la segunda línea del sub:Ahora podemos escribir
say seq-range-gist (0,1 ... Inf), 1..9para mostrar:En su pregunta, utilizó el formato en
aINDEX = VALUElugar deINDEX => VALUE. Para permitir la personalización de la esencia, agregamos un tercer&gistparámetro / argumento de rutina e invocamos eso en lugar del.gistmétodo incorporado :Observe cómo las invocaciones de "método" en el cuerpo de
seq-range-gistsub son ahora.&gist, no.gist. La sintaxis.&fooinvoca un sub&foo(que generalmente se invoca escribiendo solofoo), pasando el invocante a la izquierda del.como un$_argumento para el sub.Tenga en cuenta también que he hecho que el
&gistparámetro tenga un nombre precediéndolo con un:.Entonces ahora
say seq-range-gist (0,1 ... Inf), 1..9, gist => { "a{.key} = {.value}" }muestra:Agregar esmalte
El resto de esta respuesta es material adicional para los lectores que se preocupan por el esmalte.
say seq-range-gist (0, 1, 2, 3), ^3muestra:Ups E incluso si hubiera más pares que la cabeza y la cola combinados, por lo que al menos no obtuvimos líneas repetidas, aún sería inútil usar el
head, ..., tailenfoque para eludir solo uno o dos elementos. Cambiemos la última declaración en el sub cuerpo para eliminar estos problemas:A continuación, sería bueno que el submarino hiciera algo útil si se llama sin un rango o esencia. Sobre todo que podemos arreglar que al dar a las
@rangey&gistlos parámetros por defecto adecuados:Si no
@seqes perezoso , el valor predeterminado es el rango completo de . Si es infinito (en cuyo caso también es vago), entonces el valor predeterminado de hasta 100 está bien. Pero, ¿qué pasa si es perezoso pero produce menos de 100 valores definidos? Para cubrir este caso, adjuntamos a la declaración:@range@seq@seq@seq.grep: *.value.defined@pairsOtra mejora simple serían los parámetros opcionales de cabeza y cola, lo que llevaría a una solución final pulida:
fuente
...parte que hace que se parezca más a un programa en C. Entonces esto responde a ambas partes de mi pregunta, de verdad. En cuanto a la solución 'integral', se ve un poco intimidante, realmente.Puede omitir los primeros valores de N en cualquiera
IterableoSequenceconskip:Si no especifica un número, se saltará solo un elemento.
fuente
skipparece eliminar solo la salida, es decir, el elemento con el índice 0 (a0) permanece. Lo intenté@seq:deletey simplemente reemplacé el elemento 0 con(Any)skipsolo actuará como si no existen los elementos omitidos. Esto puede o no ser lo que quieres :-)skipen el medio para que se lea:for @seq[^10].skip(0).kvque , literalmente, no omitir el elemento 0th y no importa si me dan como argumento paraskip1 o 2, que sólo distorsiona la salida desde ese momento. Necesito una forma práctica de eliminar el elemento 0 desde cero.for @seq[^10].kv.skip(2)es lo que estás buscando?skipafter.kvpero usando argumentos distintos de 2, por lo que no funcionó. Gracias por la solución.Esto podría ser un poco más idiomático:
No necesita usar una variable léxica dentro de la secuencia; Las variables de marcador de posición
Whatevero bien se pueden usar con seguridad dentro de las secuencias. Luego, simplemente puede seleccionar los elementos de la secuencia que desea imprimir. Que vuelve«(0 1 2 3)(7 8 9 10)»fuente
whateveroperador se está actualizando pero la salida de serie / secuencia no aborda el problema principal. Me gustaría imprimir la serie tal como se ve en los libros de texto de matemáticas, es decir, con...notación intermedia.