• Publicidad

Reducir líneas en script

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

Reducir líneas en script

Notapor pablgonz » 2013-12-08 12:48 @575

Hola a todos, tengo las siguientes líneas dentro de un script:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $dir = "$tempDir/$imageDir"; # directorio en el cual están las imágenes
  2. my $oldname = '';
  3. my $renNo = 1;
  4. if(opendir(DIR,$dir)){ # abro el directorio
  5. foreach (readdir DIR){ # lo recorro
  6.        $oldname = $_;  # paso todo a la variable local
  7.     if ( $oldname =~ /($name-fig-)(\d+|\d+[-]\d+).ppm/) { # regex para name-fig-0000001.ppm
  8.         my $renNo   = int($2); # parte entera [000001]=1, [000002]=2, [x]=natural
  9.         my $newname="$1$renNo.ppm"; # en $1 está el nombre, en $2 [00001]
  10.         rename("$dir/$oldname","$dir/$newname"); # renombro
  11.                                     }
  12.                             }
  13.                     }
  14. closedir DIR;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Básicamente lo que hace es renombrar archivos de esta forma:
Sintáxis: [ Descargar ] [ Ocultar ]
  1.   name-fig-000001.ppm  
  2.   name-fig-000002.ppm  
  3.   name-fig-000003.ppm  
  4.      ... 
  5.   name-fig-00000n.ppm  
a esta forma:
Sintáxis: [ Descargar ] [ Ocultar ]
  1.   name-fig-1.ppm  
  2.   name-fig-2.ppm  
  3.   name-fig-3.ppm  
  4.      ...  
  5.   name-fig-n.ppm  
el directorio siempre existe, y los ficheros dentro de éste también, ¿puede hacer esto de una manera más eficaz? ¿o en menos líneas?
Salu2
Pablo
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Publicidad

Re: Reducir líneas en script

Notapor explorer » 2013-12-08 13:22 @599

No mucho más...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use v5.11.2;                                          # necesario, para el while mágico
  2.  
  3. my $dir = "$tempDir/$imageDir";                       # directorio en el cual están las imágenes
  4.  
  5. if (opendir(DIR,$dir)) {                              # abro el directorio
  6.     while (my $oldname = readdir DIR) {               # lo recorro
  7.                                                       # el nuevo nombre es fruto de una sustitución
  8.         my $newname = $oldname =~ s/^($name-fig-)(\d+).ppm$/$1 . (0+$2) . ".ppm"/re;
  9.  
  10.         if ($oldname ne $newname) {                   # comprobación
  11.             rename("$dir/$oldname", "$dir/$newname"); # renombro
  12.         }
  13.     }
  14.     closedir DIR;
  15. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
En el operador de sustitución hacemos varias cosas:
  • la opción /e indica que la segunda parte del operador es una expresión Perl, no un literal, así que debe interpretarse y ejecutarse, y el resultado, será la sustitución
  • la opción /r indica "sustitución no destructiva". Quiere decir que, aunque estamos hablando de hacer una sustitución en $oldname, realmente se está produciendo esa sustitución en una copia de la cadena, aparte, y el resultado de la operación no será el número de sustituciones, sino esa cadena resultado, que guardaremos en $newname (más información en perldoc perlop, en la sección donde explica el operador s///)
El if() que sigue es importante, en caso de que pueda existir algún archivo en el directorio, que no coincida con el patrón que buscamos. Si estamos seguros de que en el directorio todos los archivos siguen ese patrón, puedes quitarlo.
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: Reducir líneas en script

Notapor pablgonz » 2013-12-08 13:29 @603

Gracias, explorer, faltaba el $ antes de name.

Dame una aclaración, en la línea:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  my $newname = $oldname =~ s/^($name-fig-)(\d+).ppm$/$1 . (0+$2) . ".ppm"/re;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
no usas «" "» en $1 y luego usas dos veces «.» para concatenar, ¿me puedes explicar qué está pasando?
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Re: Reducir líneas en script

Notapor explorer » 2013-12-08 14:48 @658

Las comillas dobles sirven para interpolar su contenido: si dentro hay una variable, se produce el cambio de la variable por el contenido de esa variable:

my $var1 = "algo más $var2"; # $var1 tendrá "algo más" más el contenido de la variable $var2

Ahora bien, si solo contamos con una variable,

my $var1 = "$var2"; # $var1 tendrá el contenido de la variable $var2

no son necesarias las comillas, porque, realmente, solo queremos hacer una asignación:

my $var1 = $var2; # $var1 tendrá el contenido de la variable $var2


En el caso de

$1 . (0+$2) . ".ppm"

Estamos concatenando el valor que tiene $1, junto con lo que salga de la operación mátemática 0+$2, junto con el literal '.ppm'.

No necesitamos las comillas dobles en ninguna parte, porque no estamos haciendo ningún tipo de interpolación de variables. Solo estamos concatenando cadenas de caracteres.
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: Reducir líneas en script

Notapor pablgonz » 2013-12-08 17:51 @785

Muchas gracias por la explicación, lo de la «operación matemática» lo estuve buscando (hace tiempo) así fue como di con int($), claro, tu código es más conciso y fácil de leer.
Saludos
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)


Volver a Básico

¿Quién está conectado?

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

cron