|
71
|
Programación / Scripting / Re: duda ejercicio combinatoria
|
en: 18 Abril 2015, 17:53 pm
|
Perdón, pero para subir 4 escalones a mi me salen 8 combinaciones: 4 3,1 2,2 2,1,1 1,3 1,2,1 1,1,2 1,1,1,1 Muestro aquí mi solución, usando el motor de expresiones regulares de Perl, realizando una búsqueda exhaustiva por todas las combinaciones, al provocar un fallo premeditado que obliga a que el motor haga "backtracking" y busque una nueva solución. Como no sé mucho de Python, lo dejo en Perl, pero es fácil pasarlo a Python (creo). Primero, la versión que se puede ejecutar desde la línea de comandos: $ perl -E '$n = shift; $rx = ("(1*?)" x ($n-1)) . "(1+)"; $rx = qr/^$rx$/; $x = "1" x $n; $x =~ m/$rx(?{$visto{ join "," => grep { $_ > 0 } map { $+[$_] - $-[$_] } 1..$n }++ })(*FAIL)/; say join "; " => sort keys %visto' 4 1,1,1,1; 1,1,2; 1,2,1; 1,3; 2,1,1; 2,2; 3,1; 4
Y ahora la versión más normal: #!/usr/bin/env perl use feature 'say'; my %visto; # memoria de combinaciones ya vistas (evitar repeticiones) my $escalones = shift; # leemos los escalones my $rx = ("(1*?)" x ($escalones-1)) . "(1+)"; # creamos el patrón de búsqueda. Es de la forma (1*?)(1*?)...(1+) $rx = qr/^$rx$/; my $x = "1" x $escalones; # esta var. contiene tantos '1' como indiquen los $escalones $rx # buscamos una combinación (?{ $visto{ # la decodificamos join "," => grep { $_ > 0 } map { $+[$_] - $-[$_] } 1..$escalones }++ }) (*FAIL) # provocamos un fallo de 'backtraking' /x;
Ejemplo: $ descompon.pl 5 1,1,1,1,1; 1,1,1,2; 1,1,2,1; 1,1,3; 1,2,1,1; 1,2,2; 1,3,1; 1,4; 2,1,1,1; 2,1,2; 2,2,1; 2,3; 3,1,1; 3,2; 4,1; 5
|
|
|
72
|
Programación / Scripting / Re: CPAN Linux reinstalar
|
en: 10 Abril 2015, 15:30 pm
|
El Perl oficial es el v5.14.2, ese es el que hay que salvar.
El que sea más o menos fácil quitar el v5.18.1 depende de cómo haya sido instalado. Como veo que está en /usr/local... puede que sea muy fácil, con solo cambiar de nombre o eliminar los directorios del v5.18.1.
Una vez hecho eso, entrar en aptitude y solicitar la reinstalación de perl y perl-base.
|
|
|
73
|
Programación / Scripting / Re: CPAN Linux reinstalar
|
en: 9 Abril 2015, 17:17 pm
|
1- No se te ocurra ejecutar el comando cpan salvo que seas el usuario root 2- Antes de instalar algo con cpan, ejecuta el aptitude para ver si lo que quieres instalar ya estaba paquetizado (también como root, claro) Si te dice que un usuario normal no puede acceder a feature.pm, significa que el directorio donde está ese módulo no es accesible a ese usuario, seguramente por temas de permisos. /usr/local/lib/perl5/5.18.1/feature.pm /usr/share/perl/5.14.2/feature.pm Esto muestra que... ¡desastre! tienes dos Perl instalados. El v5.14.2 y el v5.18.1. Destrucción, caos, hambre, plagas y demás serán minucias con lo que pasará en esa máquina. Mira, mira. El propio Perl te lo dice: root@srvsmc:/usr/local/nagios/libexec# cpan Perl lib version (5.14.2) doesn't match executable '/usr/local/bin/cpan' version (v5.18.1) at /usr/lib/perl/5.14.2/Config.pm line 60. root@srvsmc:/usr/local/nagios/libexec# perl -E 'use strict; say $INC{"strict.pm"}' /usr/local/lib/perl5/5.18.1/strict.pm Estas líneas demuestran que el -primer- perl que se encuentra en la ruta del $PATH es el v5.14.2, pero las primeras bibliotecas que encuentra son las del v5.18.1. Esto es algo así como tener el Java de Oracle y el OpenJDK instalados a la vez: diversión asegurada  Mi recomendación es... reinstalar todo el sistema. La otra opción es... entrar con bisturí y fórceps y expulsar el Perl invasor (en tu caso, el v5.18.1). Y sin garantías de supervivencia del paciente. Yo suelo realizar este tipo de operaciones a CPU abierta (sistemas de producción que no pueden parar), así que si necesitáis ayuda profesional, pues aquí estamos.
|
|
|
75
|
Programación / Scripting / Re: CPAN Linux reinstalar
|
en: 7 Abril 2015, 14:23 pm
|
Para comprobar que está bien instalado, ejecuta $ perl -E 'use strict; say $INC{"strict.pm"}' /usr/share/perl/5.18/strict.pm strict.pm es un módulo que viene incluido en la propia distribución de Perl, así que se instala cuando se instala Perl (que es lo mismo que decir que cuando se instala el sistema). El error que sale es porque Perl no lo encuentra. Es decir: que en cualquiera de las rutas indicadas por el array especial @INC, no lo encuentra. Las rutas en las que busca ese módulo son las indicadas en el error, y que se pueden ver así: $ perl -E 'say for @INC' /opt/oracle/instantclient_12_1/DBD-Oracle-1.74/lib/DBD/ /etc/perl /usr/local/lib/perl/5.18.2 /usr/local/share/perl/5.18.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.18 /usr/share/perl/5.18 /usr/local/lib/site_perl En el ordenador donde estoy ahora, que también tiene Perl v5.18.2, las rutas son las mismas, y puedo localizar la posición de strict.pm: $ locate strict.pm /home/explorer/Documentos/Desarrollo/perl/lib/strict.pm /home/explorer/Proyectos/perlspanish/old/perlspanish.5.16.2/perl/lib/strict.pm /home/explorer/perl5/perlbrew/build/perl-5.20.0/lib/strict.pm /home/explorer/perl5/perlbrew/perls/perl-5.20.0/lib/5.20.0/strict.pm /usr/share/perl/5.18.2/strict.pm De todas ellas, la original es la última, /usr/share/perl/5.18.2/strict.pm, y esa ruta sí que está en las incluidas de @INC, así que Perl en mi sistema sí que lo localiza. Debes ver en qué parte del disco de tu ordenador está el strict.pm.
|
|
|
77
|
Programación / Scripting / Re: Obtener y ordenar texto CMD y MediaInfo Cli
|
en: 31 Marzo 2015, 00:03 am
|
Se puede realizar en una sola línea: perl -E '$del = qr/\s*:\s*/; foreach (<*.mxf>) { ($name,$duration,$encoded) = qx(c:/mediainfo/MediaInfo.exe $_) =~ /Complete name$del(.*?)\n.+?Duration$del(.*?)\n.+?Encoded date$del(\d{4}-\d{2}-\d{2}).+?\n/ms; say join " | ", $name, $duration, $encoded; }'
Este código lee los nombres de todos los archivos *.mxf del directorio actual. Por cada uno de ellos (foreach), llamamos a MediaInfo. De todo lo que devuelve, nos quedamos con lo que queremos. Y finalmente, lo formateamos y sacamos a pantalla. Para guardarlo a un archivo, vale con agregar '> resumen.txt' al final. En forma de programa: #!/usr/bin/perl $DEL = qr/\s*:\s*/; # definimos un delimitador que se repite varias veces foreach $mxf (<*.mxf>) { # para todos los archivos .mxf del dir. actual # llamamos a MediaInfo my $resultado = qx(c :/mediainfo /MediaInfo .exe $mxf); # extraemos lo que queremos desde el $resultado ($name,$duration,$encoded) = $resultado =~ /Complete name$DEL(.*?)\n.+?Duration$DEL(.*?)\n.+?Encoded date$DEL(\d{4}-\d{2}-\d{2}).+?\n/ms; # formateamos los valores y los sacamos say join ' | ', $name, $duration, $encoded;}
Ejemplo de salida: d:\archivo1.mxf | 34mn 21s | 2014-12-04 d:\archivo2.mxf | 3mn 21s | 2014-12-04 d:\archivo3.mxf | 4mn 21s | 2014-12-04 d:\archivo4.mxf | 5mn 21s | 2014-12-04
|
|
|
78
|
Programación / Scripting / Re: Aprendiendo PYTHON desde cero, Lección 30.
|
en: 22 Marzo 2015, 03:25 am
|
Este comportamiento no es algo propio de Python. En Perl pasa lo mismo con los hash: $ perl -E '%x = ( a => 1, b => 2, c => 3); say "$_ => $x{$_}" for keys %x' b => 2 a => 1 c => 3 $ perl -E '%x = ( a => 1, b => 2, c => 3); say "$_ => $x{$_}" for keys %x' c => 3 b => 2 a => 1 Se trata de una medida de seguridad (los diccionarios o hashes se usan con temas de contraseñas, control de sesiones, etc.). Si fuera predecible el orden en que salen los pares clave/valor, se podría suplantar o robar información. Existen bibliotecas que permiten recuperar la información en el mismo orden en que fue grabada. En Perl, por ejemplo, está Tie::IxHash.
|
|
|
80
|
Programación / Scripting / Re: Delimitadores consecutivos
|
en: 11 Marzo 2015, 15:53 pm
|
Yo creo que el ejemplo está mal, porque los campos que quieres extraer están en las columnas 6 y 7. Yo creo que la primera línea está mal. Si se trata de las columnas 3 y 7, se puede resolver en una sola línea de comandos: perl -anF'\|' -E 'say join "|", @F[2,6]' archivo.txt > resultado.txt
|
|
|
|
|
|
|