python 编码和 gzip 的 Perl 等价物
Perl equivalent for python encode and gzip
我正在尝试在 Perl 中生成一个压缩字符串,它等同于在 Python 中生成的字符串。
Python(产生正确的输出):
import gzip
test_file = 'example.json'
with open(test_file) as f:
output_data = gzip.compress(f.read().encode())
print(output_data)
我一直在尝试在 Perl 中工作的大致情况:
use Encode;
use IO::Compress::Gzip qw/gzip/;
use File::Slurp;
my $json = read_file('example.json', { binmode => ':raw' });
my $utf8_record = encode("utf8", $json);
my $output_data;
gzip $utf8_record => $output_data;
print $output_data;
知道我在 Perl 方面做错了什么吗?
您不会对 Perl 做任何错事。您的 Python 代码和 Perl 代码都使用 gzip 正确压缩了数据。只有 Perl 将输出打印为二进制,而您的 Python 代码打印输出的可读表示,即类似 b"\x1f\x8b..."
的内容。要获得与 Perl 类似的结果,您需要将二进制数据打印到标准输出而不是字符串表示形式,即代替 print(...)
do
sys.stdout.buffer.write(output_data)
然后两个程序都会将 gzip 压缩数据写入标准输出。请注意,输出可能仍然不同,因为默认情况下它们对 gzip 使用不同的选项(压缩率,OS 类型 ...),但是在这两种情况下数据都使用 gzip 进行了正确压缩。
我正在尝试在 Perl 中生成一个压缩字符串,它等同于在 Python 中生成的字符串。
Python(产生正确的输出):
import gzip
test_file = 'example.json'
with open(test_file) as f:
output_data = gzip.compress(f.read().encode())
print(output_data)
我一直在尝试在 Perl 中工作的大致情况:
use Encode;
use IO::Compress::Gzip qw/gzip/;
use File::Slurp;
my $json = read_file('example.json', { binmode => ':raw' });
my $utf8_record = encode("utf8", $json);
my $output_data;
gzip $utf8_record => $output_data;
print $output_data;
知道我在 Perl 方面做错了什么吗?
您不会对 Perl 做任何错事。您的 Python 代码和 Perl 代码都使用 gzip 正确压缩了数据。只有 Perl 将输出打印为二进制,而您的 Python 代码打印输出的可读表示,即类似 b"\x1f\x8b..."
的内容。要获得与 Perl 类似的结果,您需要将二进制数据打印到标准输出而不是字符串表示形式,即代替 print(...)
do
sys.stdout.buffer.write(output_data)
然后两个程序都会将 gzip 压缩数据写入标准输出。请注意,输出可能仍然不同,因为默认情况下它们对 gzip 使用不同的选项(压缩率,OS 类型 ...),但是在这两种情况下数据都使用 gzip 进行了正确压缩。