Perl6 эквивалент Perl 'store' или 'use Storable' - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь записать хеш, который записывается очень медленно, в файл данных, но я не уверен, как это делает Perl6 по сравнению с Perl5.Это похожий вопрос Хранение промежуточных данных в файле на Perl 6 , но я не вижу, как я могу использовать что-то написанное там, в частности, пакет сообщений.

Я хотел бы увидетьPerl6 эквивалент

my %hash = ( 'a' => 1, 'b' => 2, 'c' => 3, 'd' => 4);
use Storable;
store \%hash, 'hash.pldata';

, а затем чтение с помощью

my $hashref = retrieve('hash.pldata');
my %hash = %{ $hashref };

Это встроено в Perl5, это очень просто, мне не нужно устанавливать какие-либо модули (мне это нравится!), но как я могу сделать это в Perl6?Я не вижу этого в руководстве.Похоже, они говорят о чем-то другом с STORE https://docs.perl6.org/routine/STORE

Ответы [ 3 ]

0 голосов
/ 01 февраля 2019

Хотя они не соответствуют напрямую Storable, есть пара подходов, обозначенных в:

Другой вариант для простых объектов - использовать .perl для «хранения», затем EVAL для «чтения» ... из https://docs.perl6.org/routine/perl

> Returns a Perlish representation of the object (i.e., can usually be
> re-evaluated with EVAL to regenerate the object).
0 голосов
/ 01 февраля 2019

Я серьезно думаю, что вам следует перейти от Storable к JSON.Если вы используете Rakudo Star в качестве своей установки, он включает в себя несколько различных модулей JSON как часть его базовой установки, поэтому вам не нужно добавлять ничего лишнего.

JSON совместим с рядом разных языков(не только Perl) и является определенным стандартом (в отличие от Storable, который обратно несовместим).И размеры файлов JSON имеют одинаковый размер (если не меньше).

Единственный плюс Storable over JSON - обработка ссылок на код.Но если вы просто храните данные, я бы не советовал использовать Storable.

0 голосов
/ 31 января 2019

Как насчет этого?Хорошо, не так эффективно, как Storable, но, похоже, работает ....

#!/usr/bin/perl6
my $hash_ref = {
    array  => [1, 2, 3],
    hash   => { a => 1, b => 2 },
    scalar => 1,
};

# store
my $fh = open('dummy.txt', :w)
    or die "$!\n";
$fh.print( $hash_ref.perl );
close($fh)
    or die "$!\n";

# retrieve
$fh = open('dummy.txt', :r)
    or die "$!\n";
my $line = $fh.get;
close($fh)
    or die "$!\n";

my $new_hash_ref;
{
    use MONKEY-SEE-NO-EVAL;
    $new_hash_ref = EVAL($line)
        or die "$!\n";
}

say "OLD: $hash_ref";
say "NEW: $new_hash_ref";

exit 0;

Я получаю это

$ perl6 dummy.pl
OLD: array      1 2 3
hash    a       1
b       2
scalar  1
NEW: array      1 2 3
hash    a       1
b       2
scalar  1
...