Многомерные хеш-элементы в Perl6 - PullRequest
0 голосов
/ 22 января 2019

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

%key<$barcode><$position> = $sample-id

где в Perl5 это было бы

$key{$barcode}{$position} = $sample_id

После этого я могу распечатать назначения хешей, поэтому я думаю, что назначение работает.

Когда я печатаю этот хэш с

say %key.perl;

это только дает

{"\$barcode" => ${"\$position" => "ZZ12345"}}

Как я могу распечатать этот многомерный хеш, такой как Data::Dumper или DDP https://metacpan.org/pod/Data::Printer в Perl5, потому что say %key.perl не работает для многомерных хешей?

Ответы [ 2 ]

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

Вы неправильно поняли язык Perl 6.(Это понятно, и не в первый раз)

Ниже приведен сокращенный урок истории функции, которую вы пытались использовать.


В Perl 5 вам не нужно былопроцитируйте ключ, если единственное, что между {} было голым словом.

use v5.12;

my %hash;
$hash{fubar} = 'abc';
# $hash{'fubar'} = 'abc';

say qq'"@{[ $hash{fubar} ]}"';
# "abc"

Это был особый случай, и одна из целей дизайна Perl 6 - иметь как можно меньше специальныхслучаи, насколько это возможно.Таким образом, следующее не работает в Perl 6.

use v6.d;

my %hash;
%hash{fubar} = 'abc';
# %hash{ fubar() } = 'abc';

say qq'"%hash{fubar}"';
# say qq'"%hash{ fubar() }"';
===SORRY!=== Error while compiling ./test.p6
Undeclared routine:
    fubar used at lines 4, 7

Эта ошибка означает, что он даже не смог скомпилироваться.


В обоих Perl есть возможность использовать слова в кавычкахязыки.

use v5;
my @array = qw< a b c d >;
use v6;
my @array = qw< a b c d >;

В Perl 6 это значение может быть сокращено до

use v6;
my @array =   < a b c d >;

qw - это действительно сокращение Q :q :w / Q :single :words в Perl 6. Чтоэто включить поведение в одинарных кавычках и включить разбиение на слова.(разделение на пробелы)
(<> работает, потому что там не ожидается инфиксный оператор <.)

Чтобы компенсировать автоматическое цитирование пустого слова между {}, которое не было скопировано,postcircumfix <> был добавлен.Он сочетает в себе обе функции qw и {}.

use v6;
my %hash;

%hash{qw< foo bar baz >};
%hash{  < foo bar baz >};
%hash<    foo bar baz >;  # <---

В Perl есть еще более продвинутая функция кавычек 6

use v6;
my $a = 'a b "c d"';

say qqww<< $a e f 'g h ' '$a'>>.perl;
say     << $a e f 'g h ' '$a'>>.perl;
say     «  $a e f 'g h ' '$a' ».perl;
# All 3 are exactly equivalent
# ("a", "b", "c d", "e", "f", "g h ", "\$a")

qqww isсокращение от Q :qq :ww / Q :double :quotewords.Что включает в себя поведение двойных кавычек и включение разделения слов в кавычках.

:double - это то, что позволяет интерполировать $a.
:quotewords, разделяет слова на пробелы, но также допускает кавычкидля контроля того, где вещи распадаются.
(обратите внимание, что :quotewords происходит последним)

(qqw и qww также работают, но сокращенного способа их записи нет.)

Существует также postcircumfix <<>> / «».

use v6;
my %hash;
my $a = 'a b "c d "';

%hash{<< $a e f 'g h ' '$a' >>};
%hash<<  $a e f 'g h ' '$a' >>;
%hash«   $a e f 'g h ' '$a'  »;

# All 3 are exactly equivalent to
%hash{'a', 'b', 'c d ', 'e', 'f', 'g h ', '$a'};
#               ^^^^^^            ^^^^^^

Этот тип делает это так, что postfix <> является менее частным случаем.


Причина, по которой во многих примерах используется %hash<fubar>, заключается в том, что это идиоматический Perl 6.
Возможно, это следует рассматривать как более продвинутую функцию в документах и ​​ограниченное использование, потому что вы далеко непервый человек, совершивший эту ошибку.

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

<> совпадает с {''} в perl5, поэтому следует использовать только для строковых ключей. Если вы хотите использовать имена переменных, используйте:

%key{$barcode}{$position} = $sample_id это должно сработать.

Вы также можете использовать опцию двойной заостренной скобки, которая выполняет интерполяцию строк.

%key<<$barcode>><<$position>> = $sample_id

...