小编hkd*_*tam的帖子

将包转换为perl6

我想将以下内容从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 …
Run Code Online (Sandbox Code Playgroud)

perl6 raku

8
推荐指数
2
解决办法
215
查看次数

为什么使用交叉元运算符时** 2和²的行为会有所不同?

在currying下的结果是相同的,

say map * **2 , 1, 3, 5, 7, 9;
(1 9 25 49 81)
say map *² , 1, 3, 5, 7, 9;
(1 9 25 49 81)
Run Code Online (Sandbox Code Playgroud)

另一方面,通过跨元运算符,行为是不同的,

say 1, 3, 5, 7, 9 X**2;
(1 9 25 49 81)
say 1, 3, 5, 7, 9 X²;
((1 2) (3 2) (5 2) (7 2) (9 2))
Run Code Online (Sandbox Code Playgroud)

为什么使用交叉元运算符时** 2和²的行为会有所不同?

raku

8
推荐指数
1
解决办法
168
查看次数

标签 统计

raku ×2

perl6 ×1