Я хотел бы преобразовать следующее из perl5 в perl6,
$salt = pack "C*", map {int rand 256} 1..16;
Создается строка из 16 символов, в которой каждый символ имеет произвольно выбранное значение от 0 до 255. Perl5 не присваивает этим символам никакой семантики, поэтому они могут быть байтами, кодовыми точками Unicode или чем-то еще.
Я думаю, что смогу обойтись с
$salt = (map {(^256).pick.chr},^16).join;
Но я застрял на использовании пакета, вот моя попытка,
use experimental :pack;
my $salt = pack("C*",(map {(^256).pick} , ^16)).decode('utf-8');
say $salt;
say $salt.WHAT;
и результаты могут быть либо ошибкой,
Malformed termination of UTF-8 string
in block <unit> at test.p6 line 3
или что-то вроде,
j
(Str)
Моя точка зрения заключается в том, что упаковка целого числа List вернет Buf , а затем декодирование, которое должно дать требуемые Str .
Обновление:
Как указано в комментарии и ответе Buf
является правильным объектом для использования. Теперь, чтобы узнать о pack
части,
perl6 -e 'use experimental :pack; my $salt = pack("C*",(map {(^256).pick} , ^16));say $salt;say $salt.WHAT;'
Buf: 0x <7D>
(Buf)
, который упаковал только одну единицу
С другой стороны, использование P5pack (предложено Scimon) возвращает ошибку
perl6 -e 'use P5pack; my $salt = pack("C*",(map {(^256).pick} , ^16));say $salt;say $salt.WHAT;'
Cannot convert string to number: base-10 number must begin with valid digits or '.' in '⏏*' (indicated by ⏏)
in sub one at /home/david/.rakudobrew/moar-master/install/share/perl6/site/sources/D326BD5B05A67DBE51C279B9B9D9B448C6CDC401 (P5pack) line 166
in sub pack at /home/david/.rakudobrew/moar-master/install/share/perl6/site/sources/D326BD5B05A67DBE51C279B9B9D9B448C6CDC401 (P5pack) line 210
in block <unit> at -e line 1
Обновление 2:
Я не заметил разницу.
perl6 -e 'say (map {(^256).pick}, ^16).WHAT;'
(Seq)
perl6 -e 'say Buf.new((^256).roll(16)).WHAT;'
(Buf)
Теперь составьте их списки,
perl6 -e 'use experimental :pack; my $salt = pack("C*",(Buf.new((^256).roll(16)).list));say $salt;say $salt.WHAT;'
Buf:0x<39>
(Buf)
И
perl6 -e 'use P5pack; my $salt = pack("C*",Buf.new((^256).roll(16)).list);say $salt;say $salt.WHAT;'
Cannot convert string to number: base-10 number must begin with valid digits or '.' in '⏏*' (indicated by ⏏)
in sub one at /home/david/.rakudobrew/moar-master/install/share/perl6/site/sources/D326BD5B05A67DBE51C279B9B9D9B448C6CDC401 (P5pack) line 166
in sub pack at /home/david/.rakudobrew/moar-master/install/share/perl6/site/sources/D326BD5B05A67DBE51C279B9B9D9B448C6CDC401 (P5pack) line 210
in block <unit> at -e line 1
Ссылка:
Буферы и двоичный ввод-вывод
Первый подход к упаковке / распаковке в Perl 6
Заранее спасибо за помощь.