• Publicidad

Borrar elemento de un array

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Borrar elemento de un array

Notapor ingeniero » 2012-05-18 11:50 @534

¿Podría ayudarme alguien con un programa?

Tengo un array con una serie de elementos. Utilizo un foreach() para comprobar si cada uno de los elementos cumple una condición.

Mi problema es que si cumple la condición quiero que me borre dicho elemento del array, pero no sé cómo hacerlo...
ingeniero
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2012-05-18 11:40 @527

Publicidad

Re: Borrar elemento de un array

Notapor explorer » 2012-05-18 12:38 @568

Bienvenido a los foros de Perl en Español, ingeniero.

Para quitar un elemento del principio del array se usa shift().
Para quitarlo del final, pop().
Y para quitarlo de en medio (o de cualquier parte), splice().

¡Ojo!

Si quitas un elemento de en medio, todos los elementos siguientes "corren" un puesto hacia arriba, así que sus índices cambian. Cuidado con los bucles...

Más información en tu propio ordenador en perldoc perlfunc, y en la Web (traducido).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Borrar elemento de un array

Notapor ingeniero » 2012-05-18 12:42 @571

¿Cómo se utiliza la función splice ()?

¡¡Gracias por contestar!!
ingeniero
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2012-05-18 11:40 @527

Re: Borrar elemento de un array

Notapor explorer » 2012-05-18 13:38 @610

Sacado de perlfunc:

«
splice ARRAY o EXPR,DESPLAZAMIENTO,LONGITUD,LISTA
splice ARRAY o EXPR,DESPLAZAMIENTO,LONGITUD
splice ARRAY o EXPR,DESPLAZAMIENTO
splice ARRAY o EXPR

Elimina los elementos designados por DESPLAZAMIENTO y LONGITUD de un array, y los sustituye por los elementos de LISTA, si los hubiere. En contexto lista, devuelve los elementos retirados del array. En contexto escalar, devuelve el último elemento eliminado, o "undef" si no hay elementos eliminados. El array crece o se reduce según sea necesario. Si el DESPLAZAMIENTO es negativo, se cuenta la posición desde el final del array. Si se omite LONGITUD, se suprime todo desde DESPLAZAMIENTO en adelante. Si LONGITUD es negativa, elimina los elementos desde DESPLAZAMIENTO hacia adelante, excepto -LONGITUD elementos al final del array. Si ambos DESPLAZAMIENTO y LONGITUD se omiten, quita todo. Si el DESPLAZAMIENTO es más allá del final del array, Perl lanza una advertencia, y extrae al final del array.

Las siguientes equivalencias se mantienen (suponiendo que "$[ == 0 y $#a >= $i" )

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
               push(@a,$x,$y)      splice(@a,@a,0,$x,$y)
               pop(@a)             splice(@a,-1)
               shift(@a)           splice(@a,0,1)
               unshift(@a,$x,$y)   splice(@a,0,0,$x,$y)
               $a[$i] = $y         splice(@a,$i,1,$y)
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Ejemplo, suponiendo que las longitudes de array se pasan antes que los propios arrays:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
               sub aeq {  # comparar dos listas de valores
                   my(@a) = splice(@_,0,shift);
                   my(@b) = splice(@_,0,shift);
                   return 0 unless @a == @b;  # ¿misma longitud?
                   while (@a) {
                       return 0 if pop(@a) ne pop(@b);
                   }
                   return 1;
               }
               if (&aeq($len,@foo[1..$len],0+@bar,@bar)) { ... }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


A partir de Perl 5.14, "splice" puede tomar una EXPR escalar, que debe contener la referencia a un hash o un array no bendecido. El argumento es desreferenciado automáticamente. Este aspecto de "splice" es considerado altamente experimental. El comportamiento exacto puede cambiar en una futura versión de Perl.
»

Ejemplo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. @x = 1 .. 20;
  2. splice @x, 12, 4;
  3. print "@x\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Borrar elemento de un array

Notapor ingeniero » 2012-05-20 15:07 @672

¿Cómo se puede sacar de un hash una clave que desconocemos sabiendo su valor?

Mejor dicho: ¿cómo se pueden sacar de un hash todas las claves que desconocemos sabiendo su valor?

Gracias.
ingeniero
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2012-05-18 11:40 @527

Re: Borrar elemento de un array

Notapor explorer » 2012-05-20 16:38 @735

Una forma: Usamos each() para recorrer los pares clave/valor, y miramos cada uno:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while(($clave,$valor) = each %hash) {
  2.     if ($valor eq $valor_que_buscamos) {
  3.         print "Clave $clave\n";
  4.     }
  5. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Otra: hacemos un filtrado con grep() y sacando las claves con keys():
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @claves_encontradas = grep { $hash{$_} eq $valor_que_buscamos } keys %hash;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Mas información en perldoc -f keys .
Mas información en perldoc -f grep .
Mas información en perldoc -f each .
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Borrar elemento de un array

Notapor ingeniero » 2012-05-21 11:35 @524

¡¡Hola!! Ahora tenemos que hacer un programa en el que tenemos varios jugadores y lanzan dos dados. Avanzan según la suma de los dos resultados de los dos dados pero si sacas un 1 con el primer o segundo dado y en la tirada que sea, el jugador puede decidir si vale 1 o 6. Hemos usado un foreach() para la tirada de cada jugador para que así te salga su nombre y cuantas casillas avanza pero no sabemos cómo poner que cada vez que saque un 1 le pregunte el valor que le quiere dar.

¡¡GRACIAS!!
ingeniero
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2012-05-18 11:40 @527

Re: Borrar elemento de un array

Notapor explorer » 2012-05-21 11:58 @540

¿Con un if()?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Borrar elemento de un array

Notapor ingeniero » 2012-05-21 12:11 @549

¿Y no hay alguna forma de hacerlo utilizando subrutinas? Gracias.
ingeniero
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2012-05-18 11:40 @527

Re: Borrar elemento de un array

Notapor explorer » 2012-05-21 14:56 @664

Pues sí... se puede meter un if() dentro de una subrutina...

Y como se podría ejecutar una subrutina asociada a cada valor del dado, se podría hacer una matriz de despacho, por ejemplo.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my %tabla = (
    '1' => \&preguntar(),
    '2' => \&avanza(2),
    '3' => \&avanza(3),
    '4' => \&avanza(4),
    '5' => \&avanza(5),
    '6' => \&avanza(6),
);

...;

$tabla{$dado}->();   # ejecutamos la subrutina según el valor del $dado
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 15 invitados