如何在Perl 6中声明和创建"数组数组"类型的变量?在Perl的6文档中,没有任何相关内容.从理论上讲,我可以做到这一点
@@var1
Run Code Online (Sandbox Code Playgroud)
但这不起作用.
这是我可以找到定义的情况,但我不太了解它.从官方文档:
瞬间是以原子秒为单位测量的特定时刻,具有分数.它不依赖或意识到任何时代.
我不明白如何在没有时代的情况下指定特定时刻?它没有参考点吗?在两台不同的Linux机器上,似乎两个Instants都提到自POSIX Epoch以来的几秒钟.我的猜测是Instants确实有一个有效的开始时间,但是开始时间是依赖于实现/设备的.
# machine1
say(now * (1/3600) * (1/24) * (1/365.25)); # years from zero point
46.0748226200715
# machine2
say(now * (1/3600) * (1/24) * (1/365.25)); # years from zero point
46.0748712024946
Run Code Online (Sandbox Code Playgroud)
无论如何,我的问题是,可以依赖Instants在不同进程之间保持一致,还是只用于"内部"使用?
我正在玩一个字符串的位置界面.我知道如何在Perl 6中像Python一样切割字符串?,但我很好奇,如果我能让这件事只是为了咯咯笑.
我想出了这个例子.阅读职位很好,但我不知道如何设置multi处理任务:
multi postcircumfix:<[ ]> ( Str:D $s, Int:D $n --> Str ) {
$s.substr: $n, 1
}
multi postcircumfix:<[ ]> ( Str:D $s, Range:D $r --> Str ) {
$s.substr: $r.min, $r.max - $r.min + 1
}
multi postcircumfix:<[ ]> ( Str:D $s, List:D $i --> List ) {
map( { $s.substr: $_, 1 }, @$i ).list
}
multi postcircumfix:<[ ]> ( Str:D $s, Int:D $n, *@a --> Str ) is rw {
put …Run Code Online (Sandbox Code Playgroud) 转换为base4时,Perl 6的精度会下降.如何保持精度?
'0.2322130120323232322110'.parse-base(4)
--> perl6 output : 0.728295262649453
--> high precission value: 0.728295262649453434278257191181182861328125
Run Code Online (Sandbox Code Playgroud)
问题是,当转换0.728295262649453到base(4),输出是不是原来的号码.
0.72829526264945.base(4)
--> output: 0.232213012032323232210333
--> original: 0.2322130120323232322110
Run Code Online (Sandbox Code Playgroud)
请解释一下,如何在转换后获得相同的值?
我试图用Perl 6读取和更新一些MS Excel(xlsx)文件.我应该下载哪些模块?
我通过谷歌搜索看到一个Perl 6作家:
https://github.com/evanmiller/XLSX-Writer
这是用于写作的吗?
我没有看到任何特定于Perl 6的模块在XLSX中读取.是否有一些阅读模块?
将数据导入Perl 6 Native指针并不是什么大不了的事:
sub memcpy( Pointer[void] $source, Pointer[void] $destination, int32 $size ) is native { * };
my Blob $blob = Blob.new(0x22, 0x33);
my Pointer[void] $src-memcpy = nativecast(Pointer[void], $blob);
my Pointer[void] $dest-memcpy = malloc( 32 );
memcpy($src-memcpy,$dest-memcpy,2);
my Pointer[int] $inter = nativecast(Pointer[int], $dest-memcpy);
say $inter; # prints NativeCall::Types::Pointer[int]<0x4499560>
Run Code Online (Sandbox Code Playgroud)
但是,我认为没有办法让它们脱离Pointer[int]另一个而不是创建一个函数来完成它,因为它nativecast显然是在相反的方向上工作,或者至少不是在向非本地类型转换的方向(这应该是显而易见的名称).你会怎么做?
更新:例如,使用数组会使其更加可行.然而
my $inter = nativecast(CArray[int16], $dest);
.say for $inter.list;
Run Code Online (Sandbox Code Playgroud)
这有效,但会产生错误: Don't know how many elements a C array returned from a library
更新2:继克里斯托夫的回答(谢谢!)之后,我们可以对此进行更多细化,然后我们将这些值重新纳入 …
这段代码:
constant %what = { doesn't => 'change' };
%what = { will => "change" }
Run Code Online (Sandbox Code Playgroud)
应该说“不能修改不可变的哈希”。但是,它说:
Potential difficulties:
Useless use of hash composer on right side of hash assignment; did you mean := instead?
Run Code Online (Sandbox Code Playgroud)
Positionals有几乎相同的问题,但错误有所不同。在这种情况下,它不能修改不可变的,而只能修改一个Str:
constant @what = <does not change>;
@what = <does change> # Cannot modify an immutable Str (does)
Run Code Online (Sandbox Code Playgroud)
标量工作正常。这是LTA错误消息的情况,还是我缺少的一些容器魔术在起作用?
标识符术语在文档中与常量一起定义,使用情况几乎相同,尽管术语在运行时计算其值,而常量在编译时获取。可能会使术语使用全局变量,但这是遥不可及的,因此我想这不是它们的用例。OTOH,它们可能只是带有空签名的例程:
sub term:<þor> { "Is mighty" }
sub Þor { "Is mighty" }
say þor, Þor;
Run Code Online (Sandbox Code Playgroud)
但是您已经可以使用空签名定义例程。但是,可以编写以下错误:
say Þor ~ Þor;
Run Code Online (Sandbox Code Playgroud)
与术语不同,它将产生一个many positionals passed; expected 0 arguments but got 1。但是,这似乎有些牵强,您可以通过在末尾添加()来节省麻烦。
另一个可能的用例是违反普通标识符的规则
sub term:<?> { True }
say ?; # True
Run Code Online (Sandbox Code Playgroud)
我还有其他用例吗?
我知道
perl6 -e '@r = do for ^500 {start { .say; sleep 3 }}; await @r'
Run Code Online (Sandbox Code Playgroud)
moar在我的系统上创建了大约十几个线程并将它们用作承诺池,但我想像Go一样立即启动它们.那可能吗?
任何人都可以帮助知道如何计算不.在PERL 6中,哈希中的键是什么?寻找没有手动循环的东西.
提前致谢!
编辑:到目前为止尝试了以下但没有运气.
my %hash = 1 => "one", 2 => <21,22,23>, 3 => "three" ;
my $count = %hash.keys [ makes it a flat list ]
my $count = %hash.count [no such method]
my $count = keys %hash [provides all the keys but not the count]
Run Code Online (Sandbox Code Playgroud)