将包转换为perl6

hkd*_*tam 8 perl6 raku

我想将以下内容从perl5转换为perl6,

$salt = pack "C*", map {int rand 256} 1..16;
Run Code Online (Sandbox Code Playgroud)

它创建一个包含16个字符的字符串,其中每个字符都有一个从0到255的随机选择值.Perl5不会为这些字符分配任何语义,因此它们可以是字节,Unicode代码点或其他内容.

我想我可以顺其自然

$salt = (map {(^256).pick.chr},^16).join;
Run Code Online (Sandbox Code Playgroud)

但我一直坚持使用包,这是我的尝试,

use experimental :pack;

my $salt = pack("C*",(map {(^256).pick} , ^16)).decode('utf-8');

say $salt;
say $salt.WHAT;
Run Code Online (Sandbox Code Playgroud)

结果可能是一个错误,

Malformed termination of UTF-8 string  
      in block <unit> at test.p6 line 3
Run Code Online (Sandbox Code Playgroud)

或类似的,

  j
  (Str)
Run Code Online (Sandbox Code Playgroud)

我的想法是,打包整数List将返回一个Buf然后解码应该产生所需的Str.

更新:

正如评论和答案所建议的那样,Buf是正确使用的对象.现在跟进pack部分,

perl6 -e 'use experimental :pack; my $salt = pack("C*",(map {(^256).pick} , ^16));say $salt;say $salt.WHAT;'
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

更新2:

我没有发现差异.

perl6 -e 'say (map {(^256).pick}, ^16).WHAT;'
(Seq)
perl6 -e 'say Buf.new((^256).roll(16)).WHAT;'  
(Buf)
Run Code Online (Sandbox Code Playgroud)

现在制作他们的名单,

perl6 -e 'use experimental :pack; my $salt = pack("C*",(Buf.new((^256).roll(16)).list));say $salt;say $salt.WHAT;'
    Buf:0x<39>
    (Buf)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

参考:

缓冲区和二进制IO

第一种在Perl 6中打包/解压缩的方法

在此先感谢您的帮助.

msc*_*cha 8

正如ikegami在对你的问题的评论中所说,你真的应该使用a Buf,这基本上是一个字节的"字符串".

my $salt = Buf.new((^256).roll(16));
Run Code Online (Sandbox Code Playgroud)

您可以将其写入文件,例如:

spurt 'foo', $salt, :bin;
Run Code Online (Sandbox Code Playgroud)

或者使用以下代码在base-64中编码:

use MIME::Base64;
my $encoded = MIME::Base64.encode($salt);
Run Code Online (Sandbox Code Playgroud)

但如果你需要这个相当安全的话,看看Crypt :: Random

use Crypt::Random;
my $salt = crypt_random_buf(16);
Run Code Online (Sandbox Code Playgroud)


Sci*_*mon 5

最简单的方法是使用https://modules.perl6.org/dist/P5pack:cpan:ELIZABETH,它允许您使用Perl5包语法.