我想将以下内容从perl5转换为perl6:
它创建一个由16个字符组成的字符串,每个字符的值从0到255随机选择。Perl5对这些字符不赋予任何语义,因此它们可以是字节、Unicode代码点或其他内容。
我认为我可以应付。
或者类似于这样,
我的思路是将整数List打包后返回一个Buf,然后对其进行解码就可以得到所需的Str。 更新: 正如评论和答案所建议的那样,
现在请将它们制成列表形式,
并且
$salt = pack "C*", map {int rand 256} 1..16;
它创建一个由16个字符组成的字符串,每个字符的值从0到255随机选择。Perl5对这些字符不赋予任何语义,因此它们可以是字节、Unicode代码点或其他内容。
我认为我可以应付。
$salt = (map {(^256).pick.chr},^16).join;
但我在使用pack时遇到了困难,以下是我的尝试:
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;'
缓冲区: 0x<7D> (缓冲区)
仅打包一个单元
另一方面,使用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
参考资料:
感谢您的帮助。
decode('iso-8859-1')
。虽然这是一件奇怪的事情,但你为什么认为它不应该是一个Buf
呢?如果你试图生成一个(不安全的)加密密钥,那么你正在生成任意字节,而Buf
将是适当的类型。 - ikegami^256.roll(16)
应该可以给你16个随机数字,而不需要映射。等我起来后会进一步查看。 - Scimon Proctor