Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » En Comunidad » Proyectos » Necesito traducir una función de bash a Perl Responder al tema
Nuevo tema


Página 1 de 1  [ 6 mensajes ] 
 
Nota 2011-05-12 08:51 @410

Perlero Nuevo
Registrado: 2011-05-12 08:30 @395
Mensajes: 3
Necesito traducir una función de bash a Perl
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:

Syntax: [ Download ] [ Hide ]
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. }


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


Nota 2011-05-12 09:38 @443
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10268
Re: Necesito traducir una función de bash a Perl
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...

Syntax: [ Download ] [ Hide ]
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. }

Es obvio que se pueden eliminar las llamadas externas a dd y curl, pero eso puede llevar más tiempo.

_________________
JF^D Perl programming


Nota 2011-05-12 09:55 @455

Perlero Nuevo
Registrado: 2011-05-12 08:30 @395
Mensajes: 3
Re: Necesito traducir una función de bash a Perl
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.


Nota 2011-05-12 11:47 @532

Perlero Nuevo
Registrado: 2011-05-12 08:30 @395
Mensajes: 3
Re: Necesito traducir una función de bash a Perl
La función me quedo así:
Syntax: [ Download ] [ Hide ]
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. }

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?


Nota 2011-05-12 12:41 @570
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10268
Re: Necesito traducir una función de bash a Perl
Quita "local", a ver...

_________________
JF^D Perl programming


Nota 2011-05-16 02:50 @160

Perlero Frecuente
Registrado: 2011-01-22 12:56 @580
Mensajes: 118
Re: Necesito traducir una función de bash a Perl
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


Responder al tema  [ 6 mensajes ] 

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO