我正在寻找一种方法将多个值附加到@array.该文档指出,有一个名为.append的方法可以完成这项工作.但是当我做这样的事情时:
my @array = <a b>;
my @values = 1,2,3;
@array.append: @values, 17;
Run Code Online (Sandbox Code Playgroud)
我得到一个嵌套的结果:
[a b [1 2 3] 17]
Run Code Online (Sandbox Code Playgroud) 我有一个1608240行的数据文件.该文件是分段的.每个部分在开始行中都有一个唯一的单词,所有部分在该部分的最后一行中都有相同的单词"doneSection".
我试图通过执行以下操作来删除某些部分(由原始帖子中的@raiph重新格式化代码,以使代码更易于解释):
# using named subrules/regex is EXTREMELY slow;
# it reads about 2 lines per second, and grinds to halt
# after about 500 lines: (>> is the right word boundary)
perl6 -e 'my regex a { [ <{<iron copper carbon>.join("||")}> ] };
my $x = 0;
for "/tmp/DataRaw".IO.lines {
$*ERR.print( "$x 1608240 \r" );
++$x;
.say if m/:i beginSection \s+ <a> >>/ or
(m/:i \s+ <a> \s+ /
ff
m/:i doneSection/);
}'
# however, if I …Run Code Online (Sandbox Code Playgroud) 我的本地分布如下:
.
??? META6.json
??? lib
??? Foo.pm6
Run Code Online (Sandbox Code Playgroud)
双方perl6 -I. -e 'use Foo;'并perl6 -Ilib -e 'use Foo;'编译和运行,所以哪一个我应该使用,为什么?
我开发了一个用于处理文档集合的模块。
该软件的一次运行会收集有关它们的信息。数据存储在称为%processed和 的两个结构中%symbols。需要缓存数据以供后续在同一组文档上运行软件,其中一些文档可能会发生变化。(文档本身是使用CompUnit 模块缓存的)。
目前数据结构的存储/恢复如下:
# storing
'processed.raku`.IO.spurt: %processed.raku;
'symbols.raku`.IO.spurt: %symbol.raku;
# restoring
my %processed = EVALFILE 'processed.raku';
my %symbols = EVALFILE 'symbols.raku';
Run Code Online (Sandbox Code Playgroud)
将这些结构输出到可能非常大的文件中可能会很慢,因为散列被解析以创建字符串化形式,并且因为它们正在重新编译而在输入时很慢。
它不用于检查缓存文件,仅用于保存软件运行之间的状态。
此外,虽然这对我的用例来说不是问题,但这种技术不能在一般情况下使用,因为字符串化(序列化)不适用于 Raku 闭包 - 据我所知。
我想知道是否可以使用 CompUnit 模块,因为它们用于存储模块的编译版本。那么也许,它们可以用来存储数据结构的“编译”或“内部”版本?
有没有办法做到这一点?
如果没有,是否有任何技术原因可能无法实现?
是否有更简洁的方法将抛出的异常提升为失败而不是以下?
try {
die 'always';
CATCH { default { fail $_ } }
}
Run Code Online (Sandbox Code Playgroud) 我不完全理解文档,所以我尝试过clone,似乎有一个可变类的属性,它可以在旧对象中使用旧对象进行更改(这就是我不想要的) .如何使它们(即副本和原件)完全分开?
class A {
has @.a;
}
my A $x = A.new;
my A $y = A.new;
$x.a = 1, 2;
$y = $x.clone;
$x.a.push(4);
say $y.a; # [1 2 4]
Run Code Online (Sandbox Code Playgroud) Proc::Async是Perl 6用于与系统异步交互的类之一.文档指定了这种绑定到外部程序输出的方式:
my $p = Proc::Async.new("ls", :out);
my $h = "ls.out".IO.open(:w);
$p.bind-stdout($h);
await $p.start;
say "Done";
Run Code Online (Sandbox Code Playgroud)
(添加了一些修改,比如等待承诺).但是,我不知道如何打印输出$p.添加tap产生此错误:
Cannot both bind stdout to a handle and also get the stdout Supply
Run Code Online (Sandbox Code Playgroud)
在bind-stdout.p6第8行的块中
文档中有print写入和写入方法,但read除了阅读文件之外,我不知道如何使用它.任何的想法?
当我这样做时use Foo:ver<1.0>;,将加载模块的1.0版本Foo。但是,当我这样做时会发生什么use Foo;呢?
我在 Perl 中使用了 CPAN Perl 模块 Data::Printer (DP)。它工作得很好。
现在我想在 Raku 代码中使用它。
当我使用该:from<Perl5>功能导入它然后使用它运行代码时,注释(tied to Perl6::Hash)会附加到哈希的显示中。1
正如DP 的 CPAN 文档所示,此注释由选项控制show_tied。我想将其关闭(设置为0)而不是默认开启(设置为1)。这是我在 Perl 中的做法:
use Data::Printer show_tied => 0;
Run Code Online (Sandbox Code Playgroud)
但是当我在 Raku 中尝试这个时:
use Data::Printer:from<Perl5> show_tied => 0;
Run Code Online (Sandbox Code Playgroud)
我得到:
从“Data::Printer”导入时出错:没有这样的标签“show_tied”
show_tied在 Raku 中使用 DP 时如何关闭?
1也许这是因为Inline::Perl5(实现该:from<Perl5>功能)正在做一些事情来实现流畅的 Perl/Raku 互操作。
模块A有一个成员变量 name c,带有一个 WHERE 子句:
unit class A;
my \MAXVALUE = 1000_000;
has $.c where 0 < * < MAXVALUE;
method gist() {
"$!c";
}
Run Code Online (Sandbox Code Playgroud)
设置RAKULIB环境变量:
set RAKULIB="d:\scripts\Raku\A\lib" # Windows
export RAKULIB="/opt/scripts/Raku/A/lib" # Linux
Run Code Online (Sandbox Code Playgroud)
像这样使用模块A:
use A;
my $a = A.new(c => 1);
say $a;
Run Code Online (Sandbox Code Playgroud)
但得到类型检查错误:
Type check failed in binding to parameter '<anon>'; expected Any but got Mu (Mu)
in whatevercode at D:\scripts\Raku\Raku\A\lib\.precomp\C6EB86CB837D3BCAAA3D85B66CE337C820700C08\6D\6DCD4CE23D88E2EE9568BA546C007C63D9131C1B line 1
in block <unit> at basic.rakutest line 3
Run Code Online (Sandbox Code Playgroud)
这是一个错误吗?
乐库版本: …
perl6 ×7
raku ×3
module ×2
performance ×2
append ×1
arrays ×1
asynchronous ×1
caching ×1
clone ×1
deep-copy ×1
flatten ×1
import ×1
metadata ×1
nested ×1
package ×1
perl ×1
pipe ×1
predicate ×1
process ×1
rakudo ×1
regex ×1
shallow-copy ×1
stdout ×1
tags ×1
try-catch ×1
versioning ×1
where-clause ×1