mad*_*mma 10 arrays perl6 raku
我们来看一个Java的例子byte[] data.在Perl的方法签名中,我可以做,method myMethod($data)但这是一种有用的动态类型.
但是,我希望操作一个字节数组 - 那么有没有一种首选的方法将数据类型转换为字节数组或远程类似的东西?
我环顾四周,看到这里的代码将源数据转换为字节数组:
my $arr = Buf.new('mystring'.encode('utf-8'));
say $arr;
Run Code Online (Sandbox Code Playgroud)
这只是我的方法的首选输入,它将Buf通过$data方法变量进行操作吗?
不确定这个问题,但这是你在找什么?
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)
Run Code Online (Sandbox Code Playgroud)
也许这有用:
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>
Run Code Online (Sandbox Code Playgroud)
我已经削减了sigils(用于\变量声明而不是$等等)以减少混乱(削减符号意味着它们在声明后被丢弃).我希望这会使阅读更容易.如果这对您有用或者实际上让它变得更难,请告诉我.
子签名中的= 0和= buffer.end位是默认值.
如果您对P6非常熟悉,那么».&{ $_ +&= mask }表达意味着什么就很明显了.但你不是,所以我会解释它.
用英语读取它意味着,给定左边的缓冲区元素范围,在每个元素上迭代(并行编译器希望这样做),逐位地对每个元素进行AND运算mask.
在computerese中详细阅读:
»
Run Code Online (Sandbox Code Playgroud)
» 迭代左侧的操作数(左操作数对应于SPMD的MD位)并在每次迭代时在其右侧(对应于SPMD的SP位)应用操作.
仅»在SP和MD操作数是SPMD安全的情况下使用,即单个操作不会相互干扰.(如果你不确定,可以使用类似for循环的东西map.或者更确切地说.在这种情况下,希望操作(使用掩码对每个元素进行按位AND运算)是SPMD安全的.
要记住这个用法的用途»,请记住它是一个SPMD操作和/或注意它是如何显示两个并行>(提醒你它假定并行语义,即编译器可以自由地并行化),左侧大于右侧(提醒你左操作数是一个复数,即它可以并且通常具有多个元素,而右边总是只有一个操作).
.
Run Code Online (Sandbox Code Playgroud)
这是方法调用操作符.它在左侧调用了该方法,并在其左侧调用了该方法.
&
Run Code Online (Sandbox Code Playgroud)
&在.强制将右侧的表达强制&解释为例行之后.
{ ... }
Run Code Online (Sandbox Code Playgroud)
紧接着后面的支撑代码.&被解释为闭包(例程).在闭包内部$_(可以读作"this one")对每个元素进行别名,这是因为迭代操作数到左边的».&.
$_ +&= mask
Run Code Online (Sandbox Code Playgroud)
这条线就是这种形式LHS op= RHS.这个表格是简写LHS = LHS op RHS.所以闭包中的代码是:
$_ = $_ +& mask
Run Code Online (Sandbox Code Playgroud)
即"这一个成为一个按位并用面具掩盖".
我向发现这个答案令人困惑的读者道歉; 请在下面留下评论,我会做出相应的反应,也许会写一个完全不同的,更简单的新答案.我希望@madcrazydrumma发现它有趣且有用.