• Publicidad

Eliminar un elemento de un arreglo por el usuario

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

Eliminar un elemento de un arreglo por el usuario

Notapor alexismoran72 » 2021-08-28 15:14 @676

Hola a todos, necesito ayuda con un programa que estoy haciendo y hay algunas opciones que no tengo idea de cómo hacerlo.

Aquí dejo mi programa, espero me puedan ayudar :( me faltan las opciones 3, 6 y 7.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @lista;  
  2. my $accion;
  3. print "Menú:
  4. 1.- Agregar en cabecera.
  5. 2.- Agregar en cima.
  6. 3.- Agregar antes de.
  7. 4.- ¿Está vacía?
  8. 5.- Imprimir.
  9. 6.- Modificar.
  10. 7.- Eliminar.
  11. 8.- Salir.\n";
  12. do{
  13. print"\nEscoja una opción: ";
  14. chop ($opcion = <STDIN>);
  15. if ($opcion == 1){
  16.         print "Agregue valor: ";
  17.         $valor = <>;
  18.         unshift  @lista, $valor;
  19.         print "¡agregado!\n ";
  20. }
  21. elsif($opcion == 2){
  22.         print "Agregue valor: ";
  23.         $valor = <>;
  24.         push @lista, $valor;
  25.         print "¡agregado!\n ";
  26. }
  27. elsif($opcion == 3){
  28.         #Agregar antes de
  29.        
  30.         # si en la @lista están los valores [40, 50, 60]
  31.         # quiero que me permita guardar un valor por ejemplo el 5 y quiero guardarlo antes del 50
  32.         # quedaría algo así [40, 5, 50, 60]
  33.        
  34.        
  35. }
  36. elsif($opcion ==4){
  37.         if (@lista){
  38.                 print "\nNo está vacío\n";
  39.         }
  40.         else
  41.         {
  42.                 print "\nEstá Vacío\n";
  43.         }
  44. }
  45. elsif($opcion ==5){
  46.         chomp(@lista);
  47.         print "Los números agregados en la lista: @lista" . "\n";
  48. }
  49. elsif($opcion == 6){
  50.        
  51.         #Modificar
  52.        
  53.         #que me permita guardar un nuevo valor y modificar un valor dentro del @lista [40, 50, 60]
  54.         #nuevo valor a guardar 2 y quiero que el 40 sea el 2.
  55.         #[2, 50, 60]
  56.        
  57.        
  58.        
  59. }
  60. elsif($opcion == 7){
  61.         #eliminar
  62.        
  63.         #Eliminar algún número de la @lista [40, 50, 60] quiero eliminar el 50
  64.         #quedaría [40, 60]
  65.        
  66.        
  67. }
  68. elsif($opcion ==8){
  69.                 print "¿Desea salir?:
  70. 1.- SI    2.- NO";
  71.         print "\n";
  72.         chomp($accion = <STDIN>);
  73. }
  74. }while $accion ne '1';
  75. print "Salió del programa.\n";
  76.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Cualquier recomendación que tengan me podría ayudar. Muchas gracias.
alexismoran72
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2021-08-24 20:31 @896

Publicidad

Re: Eliminar un elemento de un arreglo por el usuario

Notapor explorer » 2021-08-28 16:20 @722

Hola.

Las tres opciones las puedes realizar con splice().

(De hecho, TODAS las operaciones con los arrays las puedes hacer con splice(). Lo tienes explicado en este documento: https://github.com/perldocES/perldoc-es ... rlfunc.pod en la sección splice ARRAY,DESPLAZAMIENTO,LONGITUD,LISTA). Pero... usar push(), pop(), shift() y unshift() son más cómodas.

En la opción 3, primero debes hacer una búsqueda (por ejemplo, con foreach()) para encontrar el elemento -ver más abajo-. Si no está, sacar un mensaje de error. Si está, usar splice() para insertarlo delante.

En la opción 6 es lo mismo, pero en lugar de insertar, hacer una sustitución. En este caso no necesitamos ni siquiera splice(). Si, por ejemplo, lo encuentras en la posición 0, bastaría hacer un $lista[0] = $valor;

En la opción 7, hay que buscar el elemento para saber su posición, y luego sacarlo del array. Lo puedes hacer con splice(). Por ejemplo, si @lista es (40, 50, 60), y queremos eliminar 50, primero lo buscamos y luego lo eliminamos de la @lista:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;                    # activar say(); y each() para arrays
  3.  
  4. my @lista = (40, 50, 60);
  5. my $valor_a_eliminar = 50;
  6. my $encontrado = -1;
  7.  
  8. while (my($posicion,$valor) = each @lista) {# recorremos todo el array, sacando los índices y valores
  9.     if ($valor == $valor_a_eliminar) {      # ¿lo hemos encontrado?
  10.         $encontrado = $posicion;            # sí, guardamos posición
  11.         last;                               # no hace falta seguir buscando más
  12.     }
  13. }
  14.  
  15. if ($encontrado != -1) {                    # si lo hemos encontrado,
  16.     splice(@lista, $encontrado, 1);         # en la @lista, posición $encontrado, sustituimos 1 elemento por... nada
  17. }
  18. else {
  19.     say "Error: no encontré [$valor_a_eliminar]";
  20. }
  21.  
  22. say "[",join(",",@lista),"] ", scalar(@lista), " elementos";
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: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Eliminar un elemento de un arreglo por el usuario

Notapor alexismoran72 » 2021-08-28 22:41 @987

Lo siento pero no puedo con la opción 3 y 6, llevo horas intentando :( Soy muy principiante en el tema de programación, tal vez puede ser muy fácil programar la opción 3 y 6, pero no puedo.

Aquí dejo lo que tengo, para ustedes ha de ser una abominación :lol: me estuve guiando con el código que mostró.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $encontrado = -1;
  2. print "Valores en la lista: \n";
  3. @lista = (10, 20, 30, 40);
  4. print "@lista", "\n";
  5.  
  6. print "Ingrese valor: ";
  7. $nuevo_valor = 5;
  8. print "Despues del valor: "; #poner el 5 después del 20
  9. $despues_de = 20;
  10.  
  11. while(my($posicion, $valor) = each @lista){  #######################
  12.         if($valor == $despues_de){           #Por lo que entiendo todo esto
  13.                 $encontrado = $posicion;     #es para recorrer todo el array
  14.                 last;                        #y encontrar el valor que uno quiere
  15.         }                                    #######################
  16. }
  17. if ($encontrado != 1){                       #######################
  18.         splice (@lista, $encontrado, 1);     #creo que el problema esta aquí
  19. }                                            #######################
  20. print @lista;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
alexismoran72
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2021-08-24 20:31 @896

Re: Eliminar un elemento de un arreglo por el usuario

Notapor explorer » 2021-08-29 14:44 @656

Para la opción 6, te vale con hacer una asignación, como te indiqué: $lista[$encontrado] = $nuevo_valor;

Para la opción 3 (insertar delante), hay que cambiar ligeramente splice(): splice(@lista, $encontrado, 0, $nuevo_valor);
La clave está en el tercer parámetro, que indica cuántos elementos queremos sustituir. Como no queremos sustituir, sino insertar, ponemos 0 (0 sustituciones), y entonces, splice(), en la posición $encontrado de @lista, inserta $nuevo_valor.

Prueba de que funciona:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. $ perl -E 'use v5.12; my @lista = (40, 50, 60); my $valor_a_eliminar = 50; my $encontrado = -1; my $nuevo_valor = 5; while(my($i,$v) = each @lista) { if ($v == $valor_a_eliminar) { $encontrado = $i; last } } if ($encontrado != -1) { splice(@lista, $encontrado, 0, $nuevo_valor); } say "[",join(",",@lista),"] ", scalar(@lista), " elementos"'
  2. [40,5,50,60] 4 elementos
  3.  
Coloreado en 0.002 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: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron