• Publicidad

Necesito traducir una función de bash a Perl

¿Estás desarrollando un proyecto, o piensas hacerlo? Pon aquí tu propuesta, lo más seguro es que alguien esté interesado en ayudarte.

Necesito traducir una función de bash a Perl

Notapor maxkcr » 2011-05-12 08:51 @410

Hola, les cuento de que se trata:

Soy nuevo con Perl, tengo un script para subir archivos pesados (pueden ser de varios GB) a un servidor web (una nube) escrito en bash. No lo escribí yo pero lo estuve retocando para agregarle funcionalidades.

Ahora necesito hacer lo mismo pero con un script de Perl y la función que se encarga de subir los archivos me está dando problemas:

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. upload()
  2. {
  3.   local COUNT=$(((SIZE - OFFSET + CHUNK - 1)/CHUNK))
  4.   echo -n "Uploading $COUNT chunks of $CHUNK bytes: "
  5.   dd bs=$CHUNK count=0 skip=$((OFFSET/CHUNK)) 2>/dev/null
  6.   for ((OFFSET = OFFSET/CHUNK; OFFSET*CHUNK < SIZE; OFFSET++)); do
  7.     head -c $CHUNK | curl -v -v -v --data-binary @- -K <(echo "$CSUSR") -f -s -H 'Content-Type: application/octet-stream' -H 'Content-Encoding: tar-gzip' -H 'Expect:' "${CSURI}drives/$DRIVE/write/$((OFFSET*CHUNK))"
  8.     [ $? -eq 0 ] && echo -n . && continue || echo E
  9.     cat <<EOF >&2
  10. Failed to write chunk $OFFSET of $COUNT: aborting
  11. Restart with '-d $DRIVE -o $((OFFSET*CHUNK))' to resume the upload
  12. EOF
  13.     exit 1
  14.   done
  15.   echo " ------------------- Upload completed -------------------"
  16. }
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Por favor, si alguien me puede dar una mano y decirme cómo hago esto mismo en Perl se los agradecería muchísimo.

Veo que hay llamadas a funciones externas, probé usar system("[comandos]") y $variable=`[comandos]` para ejecutarlas desde Perl pero no obtengo resultados.

Saludos
maxkcr
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2011-05-12 08:30 @395

Publicidad

Re: Necesito traducir una función de bash a Perl

Notapor explorer » 2011-05-12 09:38 @443

Bienvenido a los foros de Perl en español, maxkcr.

Esta es mi versión, pero no la he probado... seguro que hay algo que está mal...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub upload {
  2.     local $COUNT = ($SIZE - $OFFSET + $CHUNK - 1)/$CHUNK;
  3.     print "Uploading $COUNT chunks of $CHUNK bytes: ";
  4.     system("dd bs=$CHUNK count=0 skip=$((OFFSET/CHUNK)) 2>/dev/null");
  5.     for ($OFFSET = $OFFSET/$CHUNK; $OFFSET*$CHUNK < $SIZE; $OFFSET++) {
  6.         system("head -c $CHUNK | curl -v -v -v --data-binary @- -K <(echo \"$CSUSR\") -f -s -H 'Content-Type: application/octet-stream' -H 'Content-Encoding: tar-gzip' -H 'Expect:' \"${CSURI}drives/$DRIVE/write/$((OFFSET*CHUNK))\" ");
  7.         if ( $? == 0 ) {
  8.             print '.';
  9.         }
  10.         else {
  11.             print 'E';
  12.             print STDERR <<EOF;
  13. Failed to write chunk $OFFSET of $COUNT: aborting
  14. Restart with '-d $DRIVE -o $((OFFSET*CHUNK))' to resume the upload
  15. EOF
  16.         exit 1;
  17.         }
  18.     }
  19.     print " ------------------- Upload completed -------------------\n";
  20. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Es obvio que se pueden eliminar las llamadas externas a dd y curl, pero eso puede llevar más tiempo.
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: Necesito traducir una función de bash a Perl

Notapor maxkcr » 2011-05-12 09:55 @455

Muchas gracias, yo he hecho algo parecido y no ha funcionado hasta ahora. Voy a revisar ambas versiones buscando las diferencias a ver qué sucede.
maxkcr
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2011-05-12 08:30 @395

Re: Necesito traducir una función de bash a Perl

Notapor maxkcr » 2011-05-12 11:47 @532

La función me quedo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub upload()
  2. {
  3.    $CHUNK=4194304;
  4.    $OFFSET=0;
  5.  
  6.    local $COUNT=(($SIZE - $OFFSET + $CHUNK - 1)/$CHUNK);
  7.    print "Uploading $COUNT chunks of $CHUNK bytes: \n";
  8.    system("dd bs=$CHUNK count=0 skip=$((OFFSET/CHUNK)) 2>/dev/null");
  9.    for ($OFFSET = $OFFSET/$CHUNK; $OFFSET*$CHUNK < $SIZE; $OFFSET++)
  10.    {
  11.       system("head -c $CHUNK | curl -v -v -v --data-binary @- -K <(echo \"$CSUSR\") -f -s -H 'Content-Type: application/octet-stream' -H 'Content-Encoding: tar-gzip' -H 'Expect:' \"${CSURI}drives/$DRIVE/write/$((OFFSET*CHUNK))\" ");
  12.       #[ $? -eq 0 ] && echo -n . && continue || echo E
  13.       if ( $? == 0 )
  14.       {
  15.          print '.';
  16.       }
  17.       else
  18.       {
  19.          print 'E';
  20.          print STDERR <<EOF;
  21. Failed to write chunk $OFFSET of $COUNT: aborting
  22. Restart with '-d $DRIVE -o $((OFFSET*CHUNK))' to resume the upload
  23. EOF
  24.          exit 1;
  25.       }
  26.       print " ------------------- Upload completed -------------------\n";
  27.    }
  28. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

pero ahora recibo este mensaje de error:
Can't localize lexical variable $COUNT
en la línea correspondiente a la 6 en este extracto, ¿qué significa?
maxkcr
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2011-05-12 08:30 @395

Re: Necesito traducir una función de bash a Perl

Notapor explorer » 2011-05-12 12:41 @570

Quita "local", a ver...
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: Necesito traducir una función de bash a Perl

Notapor pvaldes » 2011-05-16 02:50 @160

y define $size ...

De todos modos yo lo reescribiría directamente. Jugar con dd sin especificar claramente origen y destino puede ser bastante peligroso, y más si anulas los mensajes de error, y hay muchos modos mejores de hacerlo.

dd bs=X count=0 skip=Y if=ORIGEN ? of=DESTINO? 2>/dev/null
pvaldes
Perlero nuevo
Perlero nuevo
 
Mensajes: 129
Registrado: 2011-01-22 12:56 @580


Volver a Proyectos

¿Quién está conectado?

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

cron