Estoy buscando una combinación de técnicas para crear un archivo comprimido. Más tarde, quiero descomprimir ese archivo sobre la marcha y pasar a través de la tubería al comando curl.
El problema es que el código que estoy usando produce un archivo que contiene un flujo de datos comprimido (a diferencia de un archivo):
my $fh = IO::Zlib->new("file.gz", "wb9"); if (defined $fh) { print $fh "some big data here!\n"; $fh->close; }Por eso no puedo simplemente descomprimirlo usando zcat:
zcat file.gz zcat: can't stat: file.gz (file.gz.Z): No such file or directoryy la razón principal para hacer esto es que esperaba redirigir la salida de zcat como STDIN para el comando curl más adelante:
zcat file.gz | curl -X PUT -d @- http://localhost:5822/Lo anterior funciona si creo un archivo de texto y lo comprimo. Estaba buscando una manera elegante de hacerlo desde Perl, donde no necesito crear un archivo temporal, comprimirlo, eliminar el archivo temporal primero.
Esto probablemente podría lograrse de dos maneras:
1) encuentre una manera de crear un archivo comprimido que contenga datos de archivo (en lugar de un flujo de datos)
2) encuentre un comando de Linux/Unix/OSX que se ocupe de archivos con datos comprimidos de transmisión (como zcat aparentemente no puede)
Estaría agradecido por la ayuda re. ambos sentidos
Su código Perl funciona a partir de mis pruebas, con la adición de una línea de uso necesaria:
use IO::Zlib;Usted dice que su código produce un archivo que contiene un flujo de datos comprimidos (a diferencia de un archivo). Eso no tiene ningún sentido. Un archivo es un archivo. Es un objeto en un sistema de archivos que contiene una secuencia de bytes. Su código genera un archivo ordinario, cuyo contenido es la salida comprimida de Zlib.
Creo que su problema es que el código no genera el archivo por algún motivo (¿falta de permisos?) O simplemente está buscando el archivo en el lugar equivocado.
Agregue algo de depuración para ver si el archivo se está abriendo correctamente. Reemplace su línea "nueva" con
my $fh = new IO::Zlib; $fh->open("/full/path/to/filename", "wb9") or die("couldn't open file for writing: $!");Y use una ruta completa con el nombre del archivo para que pueda estar seguro de dónde se genera el archivo. (Normalmente, se crearía en el directorio actual, pero no está claro dónde está sin contexto)