#git #raku
#git #raku
Вопрос:
У меня есть следующий фрагмент кода 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. Что такое «raku»?
2. Почему вы вызываете
decode
в Perl6, но не в версии Python?3. @melpomene Raku — это кодовое имя для Perl 6. Смотрите перенаправление на raku.do
4. @phd О, я нашел это в FAQ : » Perl 6 (который также можно назвать «Raku») — это определение языка. » (А Rakudo — это реализация.) Для меня это новость. В прошлый раз, когда я смотрел, его там не было. 🙂 Но тогда почему существуют отдельные
perl6
/raku
теги?5. Это долгая и болезненная история. Мои личные соображения: liztormato.wordpress.com/2018/11/06/on-raku и liztormato.wordpress.com/2018/11/09/on-raku-again . Пожалуйста, обратите внимание, что это личные мнения.
Ответ №1:
@melpomene попал в точку. Вы не выполняете декодирование на Python, и количество байтов в необработанном файле может быть немного больше; вставить
say uncompress($f).elems;
перед декодированием в $raw
и вы увидите, что он включает (в файл и в мою систему) на 2 байта больше. Рендеринг через utf8-c8 может объединить пару байтов в одну кодовую точку (или больше). В общем случае количество кодовых точек будет меньше, чем количество байтов в потоке ввода-вывода.
Комментарии:
1. Спасибо, jjmerelo! Это был мой первый раз, когда я читал двоичные данные, и я думаю, это видно ;-)!