当前位置: 首页 > 知识库问答 >
问题:

将包转换为perl6

澹台啸
2023-03-14

我想将以下内容从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 中打包/拆包的第一种方法

预先感谢你的帮助。

共有3个答案

令狐高洁
2023-03-14

显然“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/玛莎/女士/;

巴博耘
2023-03-14

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

姜乐语
2023-03-14

正如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但是我就是做不到? 非常感谢。