Как правильно распаковать объект Git в Raku Perl 6? - PullRequest
5 голосов
/ 31 марта 2019

У меня есть следующий фрагмент кода 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")

Однако, когда я запускаю их, они возвращают мне результаты по одному:

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

1 Ответ

8 голосов
/ 31 марта 2019

@ Мельпомена попала в точку.Вы не декодируете в Python, и число байтов в необработанном файле может быть немного больше;вставьте

say uncompress($f).elems;

перед декодированием в $raw, и вы увидите, что он включает (в файле и в моей системе) еще 2 байта.Рендеринг через utf8-c8 может объединить пару байтов в одну кодовую точку (или более).В общем случае количество кодовых точек будет меньше количества байтов в потоке ввода-вывода.

...