• 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 BigBear » 2012-01-17 10:26 @476

Hola. Tengo una lista en la que muestro el elemento que se ha seleccionado con su número de orden. El problema es que después de mostrar el dato por pantalla quiero borrarlo de la lista.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @procer = ("uno","dos","tres","cuatro","cinco","seis");
  2. my $numb = 5;
  3. print @procer[$numb];
  4. #borrar dato
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


¿Alguien me puede explicar cómo borrar dicho dato?
Última edición por BigBear el 2012-01-17 10:44 @489, editado 1 vez en total
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Publicidad

Re: Borrar elemento de un array

Notapor explorer » 2012-01-17 10:44 @489

Una cosa es borrarlo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. explorer@casa:~/Documentos/Desarrollo> perl -E '@x = 1 .. 10; delete $x[5]; $"="]["; say "[@x]"'
  2. [1][2][3][4][5][][7][8][9][10]
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Y otra cosa es eliminarlo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. explorer@casa:~/Documentos/Desarrollo> perl -E '@x = 1 .. 10; splice @x, 5, 1; $"="]["; say "[@x]"'
  2. [1][2][3][4][5][7][8][9][10]
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 BigBear » 2012-01-17 10:45 @490

¿Me podrías dar un ejemplo en un script normal?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Borrar elemento de un array

Notapor explorer » 2012-01-17 10:50 @493

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. @x = 1 .. 10;
  3. splice @x, 5, 1;
  4. $"="][";
  5. say "[@x]";
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 BigBear » 2012-01-17 11:20 @514

Tengo un problema con el siguiente código

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!usr/bin/perl
  2. #Manager 0.3
  3. #Written By Doddy H
  4.  
  5. use Color::Output;
  6. Color::Output::Init;
  7. use Win32::OLE qw(in);
  8. use Win32::Process;
  9.  
  10. &clean;
  11. &options;
  12.  
  13. sub clean {
  14.     cprint "\x0313";
  15.     print "\nManager 0.3\nCopyright 2012 Doddy Hackman\nMail:lepuke[at]hotmail[com]\n\n";
  16.     cprint "\x0x30\n\n";
  17.     my %process = getprocess();
  18.     chomp %process;
  19.     $limit = "";
  20.     for my $pid ( keys %process ) {
  21.         if ( $pid ne "" ) { $limit++ }
  22.         push( @procer, $process{$pid} );
  23.         push( @pids,   $pid );
  24.         chomp( @procer, @pids );
  25.     }
  26.     $limit--;
  27.     for my $n ( 1 .. $limit ) {
  28.         cprint "\x037";
  29.         print "Process Number: [$n]\tProcess name : $procer[$n]\tPID : $pids[$n]\n";
  30.         cprint "\x037";
  31.     }
  32. }
  33.  
  34. sub options {
  35.     cprint "\0035";
  36.     print "\n\nOptions :\n\n[a] : Close a process\n[b] Clean Console\n[c] Exit\n\n\n[+] Write you options : ";
  37.     $t = <STDIN>;
  38.     chomp $t;
  39.     if ( $t eq "a" ) {
  40.         &close;
  41.     }
  42.     elsif ( $t eq "b" ) {
  43.         reload();
  44.     }
  45.     elsif ( $t eq "c" ) {
  46.         print "\n\n[+] Written By Doddy H\n\n";
  47.         <stdin>;
  48.         exit(1);
  49.     }
  50.     else {
  51.         reload();
  52.     }
  53. }
  54.  
  55. sub close {
  56.     print "\n[+] Write the number of the process : ";
  57.     $numb = <STDIN>;
  58.     chomp $numb;
  59.     Win32::Process::KillProcess( @procer[$numb], "" );
  60.     splice @procer, $numb, 1;                           ##### FALLO #####
  61.     print "\n\n[+] OK , Process Closed\n\n";
  62.     <stdin>;
  63.     reload();
  64. }
  65.  
  66. sub reload {
  67.     system("cls");
  68.     &clean;
  69.     &options;
  70. }
  71.  
  72. sub getprocess {
  73.  
  74.     my %procesos;
  75.  
  76.     my $uno = Win32::OLE->new("WbemScripting.SWbemLocator");
  77.     my $dos = $uno->ConnectServer( "", "root\\cimv2" );
  78.  
  79.     foreach my $pro ( in $dos->InstancesOf("Win32_Process") ) {
  80.         $procesos{ $pro->{Caption} } = $pro->{ProcessId};
  81.     }
  82.     return %procesos;
  83. }
  84.  
  85. # The End ?
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


El valor no se me borra en la línea 60.
Última edición por explorer el 2012-01-17 11:31 @522, editado 1 vez en total
Razón: Formateado de código con Perltidy
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Borrar elemento de un array

Notapor explorer » 2012-01-17 11:37 @526

Con splice() estás eliminando elementos, no borrándolos.

Y al eliminar elementos, los que le siguen en el resto del array, suben un puesto, dejando al array con una longitud menor.

A lo mejor lo que quieres es simplemente borrarlos. Te vale entonces con hacer una de estas líneas:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
undef  $procer[$numb];
delete $procer[$numb];
$procer[$numb] = '';
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

teniendo en cuenta que el delete() se comporta de forma distinta con los elementos del final del array: recortará el array.
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 BigBear » 2012-01-17 11:50 @535

He encontrado una forma de solucionarlo. El código me queda así.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!usr/bin/perl
  2. #Manager 0.3
  3. #Written By Doddy H
  4.  
  5. use Color::Output;
  6. Color::Output::Init;
  7. use Win32::OLE qw(in);
  8. use Win32::Process;
  9.  
  10. &clean;
  11. &options;
  12.  
  13. sub clean {
  14.     cprint "\x0313";
  15.     print "\nManager 0.3\nCopyright 2012 Doddy Hackman\nMail:lepuke[at]hotmail[com]\n\n";
  16.     cprint "\x0x30\n\n";
  17.     my %process = getprocess();
  18.     chomp %process;
  19.     $limit = "";
  20.     for my $pid ( keys %process ) {
  21.         if ( $pid ne "" ) { $limit++ }
  22.         push( @procer, $process{$pid} );
  23.         push( @pids,   $pid );
  24.         chomp( @procer, @pids );
  25.     }
  26.     $limit--;
  27.     for my $n ( 1 .. $limit ) {
  28.         cprint "\x037";
  29.         print "Process Number: [$n]\tProcess name : $procer[$n]\tPID : $pids[$n]\n";
  30.         cprint "\x037";
  31.     }
  32. }
  33.  
  34. sub options {
  35.     cprint "\0035";
  36.     print "\n\nOptions :\n\n[a] : Close a process\n[b] Clean Console\n[c] Exit\n\n\n[+] Write you options : ";
  37.     $t = <STDIN>;
  38.     chomp $t;
  39.     if ( $t eq "a" ) {
  40.         &close;
  41.     }
  42.     elsif ( $t eq "b" ) {
  43.         reload();
  44.     }
  45.     elsif ( $t eq "c" ) {
  46.         print "\n\n[+] Written By Doddy H\n\n";
  47.         <stdin>;
  48.         exit(1);
  49.     }
  50.     else {
  51.         reload();
  52.     }
  53. }
  54.  
  55. sub close {
  56.     print "\n[+] Write the number of the process : ";
  57.     $numb = <STDIN>;
  58.     chomp $numb;
  59.     Win32::Process::KillProcess( @procer[$numb], "" );
  60.     print "\n\n[+] OK , Process Closed\n\n";
  61.     <stdin>;
  62.     reload();
  63. }
  64.  
  65. sub reload {
  66.     system("cls");
  67.     system($0);
  68.     &clean;
  69.     &options;
  70. }
  71.  
  72. sub getprocess {
  73.  
  74.     my %procesos;
  75.  
  76.     my $uno = Win32::OLE->new("WbemScripting.SWbemLocator");
  77.     my $dos = $uno->ConnectServer( "", "root\\cimv2" );
  78.  
  79.     foreach my $pro ( in $dos->InstancesOf("Win32_Process") ) {
  80.         $procesos{ $pro->{Caption} } = $pro->{ProcessId};
  81.     }
  82.     return %procesos;
  83. }
  84.  
  85. # The End ?
  86.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2012-01-17 11:56 @539, editado 1 vez en total
Razón: Formateado de código con Perltidy
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Borrar elemento de un array

Notapor explorer » 2012-01-17 12:09 @548

Me temo que @procer no hace más que crecer y crecer...

¿No sería más claro usar solo %process a lo largo del programa? Te ahorrarías unas cuantas líneas...
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 BigBear » 2012-01-17 12:56 @580

Sí, pero no sé cómo hacerlo. ¿Vos no me podrías ayudar a corregir el código?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Borrar elemento de un array

Notapor explorer » 2012-01-17 15:56 @706

Lo siento, yo no tengo Windows.
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


Volver a Básico

¿Quién está conectado?

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

cron