我想将以下内容从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)
我的思路是,打包整数列表将返回一个Buf,然后解码,这将产生所需的Str。
更新:
正如评论和回答中所建议的,Buf
是正确的使用对象。现在,继续讨论<code>包<code>部分,
perl6 -e 'use experimental :pack; my $salt = pack("C*",(map {(^256).pick} , ^16));say $salt;say $salt.WHAT;'
Buf:0x
那只装了一个单位
另一方面,使用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
参考:
缓冲区和二进制 IO
Perl 6 中打包/拆包的第一种方法
预先感谢你的帮助。
显然“C”x 16
有效,但不是“C*”
。不要问,我也不知道为什么。:-D
perl6 -e 'use experimental :pack; my $salt = pack("C" x 16,(Buf.new((^256).roll(16)).list));say $salt;say $salt.WHAT;'
Buf:0x<64 71 D4 E6 E6 AD 7B 1C DD A2 62 CC DD DA F3 08>
(Buf)
另一方面,解包确实有效。
perl6 -e 'use experimental :pack; my $salt = pack("C" x 16,(Buf.new((^256).roll(16)).list)).unpack("C*");say $salt;say $salt.WHAT;'
(35 101 155 237 153 126 109 193 94 105 70 111 59 51 131 233)
(List)
总而言之,mscha的答案是P6的“简洁明了”。为了得到一个< code>Buf,对一个< code>Buf列表进行< code >打包是一个愚蠢的往返过程。
对于其他包转换,请注意此处的两个关键点:,
Here is the difference between Perl 5 and Perl 6 pack/unpack:
Perl 5 Perl 6
pack(List) --> Str pack(List) --> Buf
unpack(Str) --> List unpack(Buf) --> List
和
一些 Perl 5 模板规则假设 Buf 和 Str 之间有一条简单的双向街道。在 Perl 5 中,Buf 和 Str 之间根本没有真正的区别,而 Perl 5 充分利用了这一点。
编辑:修复拼写错误,s/玛莎/女士/;
最简单的方法可能是使用https://modules.perl6.org/dist/P5pack: cpan: ELIZABETH,它允许您使用Perl5 pack语法。
正如ikegami在对您的问题的评论中所说,您确实应该使用Buf
,它基本上是一个字节的“字符串”。
my $salt = Buf.new((^256).roll(16));
您可以将其写入文件,如下所示:
spurt 'foo', $salt, :bin;
或者用base-64编码:
use MIME::Base64;
my $encoded = MIME::Base64.encode($salt);
但是如果你需要这个相当安全,看看地穴::随机
use Crypt::Random;
my $salt = crypt_random_buf(16);
本文向大家介绍groovy 将方法转换为闭包,包括了groovy 将方法转换为闭包的使用技巧和注意事项,需要的朋友参考一下 示例 可以使用&运算符将方法转换为闭包。
我有一个 JAR 文件,我需要将其转换为 OSGi 捆绑包。我没有JAR文件的原始源代码。 我尝试使用来自以下方面的答案:如何从jar库创建OSGi捆绑包? 但是,它们已经过时了。 编辑:我需要转换几个罐子,但数量固定。
问题内容: 我正在开发一些应用程序,它允许从SD卡中选择图像,将其保存到数据库中并为ImageView设置此值。我需要知道将uri转换为字符串并将字符串转换为uri的方法。现在,我使用了Uri的getEncodedPath()方法,但是例如,此代码不起作用: 因此,我不知道如何将Uri保存到数据库中并根据保存的值创建新的Uri。请帮我修复它。 问题答案: 我需要知道将uri转换为字符串并将字符串转
我从. csv文件读取数据到熊猫数据框如下。对于其中一个列,即,我想将列类型指定为。问题是系列缺少/空值。 当我在读取.csv时尝试将列强制转换为整数时,我得到: 或者,在阅读以下内容后,我尝试转换列类型,但这次我得到: 我如何处理这个问题?
我有一个docx4j生成的文件,其中包含几个表格、标题,最后还有一个excel生成的曲线图。 我尝试了许多方法,以将此文件转换为PDF,但没有得到任何成功的结果。 带有xsl fo的Docx4j不起作用,docx文件中包含的大部分内容尚未实现,并以红色文本显示为“未实现” 我在Apache POI中使用的代码如下: 我不知道该怎么做才能得到PDF中的图表,有人能告诉我如何继续吗? 提前感谢。
我正在努力将图像标记转换为链接并复制标记内的参数,即。 进入 我的问题不仅仅是复制src和alt数据,还包括丢失和额外的标记。 进入 和 进入 这需要对整个字符串中img标记的所有实例执行。 不是说听起来像是一个挑战,但是有人能提出一个可能的解决方案吗,我相信这可以用preg_replace但是我就是做不到? 非常感谢。