我想将以下内容从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) 在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和²的行为会有所不同?