是否有与字节数组等效的Perl 6?

时间:2018-07-12 23:39:22

标签: arrays perl6 raku

让我们以Java byte[] data为例。在Perl的方法签名中,我可以做method myMethod($data),但这是一种动态键入的形式,非常有用。

但是,我希望操纵一个字节数组-那么,是否存在一种将数据类型转换为字节数组或远程相似对象的首选方法?

我环顾四周,并在这里看到了这段代码将源数据转换为字节数组:

my $arr =  Buf.new('mystring'.encode('utf-8')); 
say $arr;

这仅仅是我的方法中首选的输入,它将通过Buf方法变量来操纵$data吗?

2 个答案:

答案 0 :(得分:6)

不确定这个问题,但这是您要寻找的吗?

my int8 @a = ^10;         # a native array of 8-bit signed bytes
sub frobnicate(int8 @b) { # a sub taking a native 8-bit array
    dd @b;
}
frobnicate @a;
# array[int8].new(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

答案 1 :(得分:6)

也许这很有帮助:

my \buffer = Buf.new: 'mystring'.encode: 'utf-8';
my \offset = 3;
my \mask   = 0x03;

sub mask-buffer-from-to (\mask,
                         \buffer,
                         \from = 0,
                         \to = buffer.end) {
  buffer[from..to]».&{ $_ +&= mask }
}
mask-buffer-from-to mask, buffer, offset;
say buffer; # Buf:0x<6d 79 73 00 02 01 02 03>

我已将斜线标记(在变量声明中使用\而不是$等)以减少混乱(斜线标记意味着它们在声明之后被删除了)。我希望这使它更易于阅读。请让我知道这是否对您有用,或者实际上是否使它变得更困难。

子签名中的= 0= buffer.end位是默认位。

如果您相当熟悉P6,显然».&{ $_ +&= mask }表示什么。但是你不是,所以我会解释。

用英语阅读,意味着在给定左侧缓冲区元素的范围的情况下,对每个元素进行迭代(如果编译器希望这样做,则并行进行),对每个元素与{{1 }}。

详细阅读计算机语言:

mask

hyperoperator的P6蒸馏液。{p>

» 对左侧的操作数进行迭代(左侧的操作数对应于SPMD的MD位),并在每次迭代时对其右侧的操作数(对应于SPMD的SP位)进行应用。

仅在SP和MD操作数是SPMD安全的情况下才使用»,即,各个操作不会相互干扰。 (如果不确定,请改用»循环或for之类的方法。)在这种情况下,希望对您显而易见的是,该操作(将每个元素与掩码进行按位AND运算) SPMD安全。

要记住map的用法是什么,只需记住它是一个SPMD op和/或注意它如何显示两个并行的»(提醒您它假设并行语义,即编译器是可以将其并行化),其左侧大于右侧(提醒您,左操作数是复数,即它可以并且通常确实具有多个元素,而右侧始终只是一个操作)。

>

这是方法调用运算符。给定左侧的调用者,它会调用右侧的方法。

.

& 紧接&之后,将.右侧的表达式解释为例程。

&

{ ... } 之后的括号代码被解释为闭包(例程)。在闭包内部,.&(可以读作“ this one”)被别名为每个元素的别名,这些元素是通过迭代$_左侧的操作数而得到的。

».&

此行的格式为$_ +&= mask 。此表格是LHS op= RHS的简写。因此,闭包中的代码是以下内容的简写:

LHS = LHS op RHS

即“这个变成位元并用mask掩盖”。

我向那些对此答案感到困惑的读者致歉;请在下面留下评论,我会做出相应的回应,也许写一个完全不同,更简单的新答案。我希望@madcrazydrumma觉得它有趣且有用。