如何在Raku Perl 6中正确解压Git对象?

5
我有下面这段 Python 代码片段:
import zlib

def object_read(repo, sha):
    path = repo + "/objects/" + sha[0:2] +  "/" + sha[2:]

    with open (path, "rb") as f:
        raw = zlib.decompress(f.read())
        return len(raw)

print(object-read(".git", "1372c654fd9bd85617f0f8b949f1405b0bd71ee9"))

以及它的P6同行之一:

#!/usr/bin/env perl6
use Compress::Zlib;

sub object-read( $repo, $sha ) {
    my $path = $repo ~ "/objects/" ~ $sha.substr(0, 2) ~ "/" ~
               $sha.substr(2, *);

    given slurp($path, :bin) -> $f {
        my $raw = uncompress($f).decode('utf8-c8'); # Probable error here?!
        return $raw.chars;
    }

}

put object-read(".git", "1372c654fd9bd85617f0f8b949f1405b0bd71ee9")

然而,当我运行它们时,它们会给我一个错位1的结果:

$ python bin.py
75
$ perl6 bin.p6
74

1
"raku" 是什么? - melpomene
3
为什么在Perl6版本中调用了decode,而Python版本中没有调用? - melpomene
@melpomene Raku是Perl 6的代号。请参见http://raku.do/上的重定向。 - phd
1
@phd 哦,我在FAQ中找到了它:“Perl 6(也可以称为“Raku”)是该语言的定义。”(而Rakudo是一种实现。)这对我来说是个好消息。上次我看的时候还没有呢。 :-) 但是为什么会有单独的perl6 / raku标签呢? - melpomene
3
这是一个漫长而痛苦的故事。我的个人看法:https://liztormato.wordpress.com/2018/11/06/on-raku/ 和 https://liztormato.wordpress.com/2018/11/09/on-raku-again/。请注意这些是个人观点。 - Elizabeth Mattijsen
显示剩余2条评论
1个回答

8

@melpomene说得很对。你不是在用Python解码,并且原始文件中的字节数可能会有点多;插入

say uncompress($f).elems;

在解码为$raw之前,你会发现它包含(在文件和我的系统中)2个字节。使用utf8-c8进行渲染可能会将几个字节合并为一个代码点(或更多)。通常情况下,IO流中的代码点数将少于字节数。


3
谢谢,jjmerelo!这是我第一次读二进制数据,我想这体现出来了;-)! - uzluisf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接