我想用惯用的Perl 6来做这件事.
我在一个嘈杂的输出文件中找到了一个很棒的连续数据块.
我想简单地打印出标题行,从Cluster Unique它后面的所有行开始,直到但不包括第一次出现空行.这是文件的样子:
</path/to/projects/projectname/ParameterSweep/1000.1.7.dir> was used as the working directory.
....
Cluster Unique Sequences Reads RPM
1 31 3539 3539
2 25 2797 2797
3 17 1679 1679
4 21 1636 1636
5 14 1568 1568
6 13 1548 1548
7 7 1439 1439
Input file: "../../filename.count.fa"
...
Run Code Online (Sandbox Code Playgroud)
这是我要解析的内容:
Cluster Unique Sequences Reads RPM
1 31 3539 3539
2 25 2797 2797
3 17 1679 1679
4 21 1636 1636
5 14 1568 1568
6 13 …Run Code Online (Sandbox Code Playgroud) 我想使用STD.pm6从Perl 6解析Perl 6代码的最小工作示例
运行这样的东西
use v6;
use STD.pm6;
my $j = slurp 'e:\src\perl6\valid-p6-script.p6';
my $o = STD::Grammar.parse($j);
say $o.perl;
Run Code Online (Sandbox Code Playgroud)
在调试器下给我绝对奇怪的输出:
e:\src\prg\perl6>c:\rakudo\bin\perl6-debug-m.bat -I. p6.p6
>>> LOADING p6.p6
>>> LOADING E:\src\prg\perl6\STD.pm6
Unhandled exception: ctxlexpad needs an MVMContext
at gen/moar/m-CORE.setting:15136 (C:\rakudo/share/perl6/runtime/CORE.setting.moarvm::24)
from gen/moar/m-CORE.setting:15250 (C:\rakudo/share/perl6/runtime/CORE.setting.moarvm:AT-KEY:95)
from gen/moar/m-CORE.setting:4291 (C:\rakudo/share/perl6/runtime/CORE.setting.moarvm:postcircumfix:<{ }>:4294967295)
from C:\rakudo/share/perl6/lib/Debugger/UI/CommandLine.pm:736 (C:\rakudo\share\perl6\lib\Debugger\UI\CommandLine.pm.mo
arvm::82)
from gen/moar/m-CORE.setting:2826 (C:\rakudo/share/perl6/runtime/CORE.setting.moarvm:sink-all:168)
from gen/moar/m-CORE.setting:10187 (C:\rakudo/share/perl6/runtime/CORE.setting.moarvm:sink:36)
from C:\rakudo/share/perl6/lib/Debugger/UI/CommandLine.pm:730 (C:\rakudo\share\perl6\lib\Debugger\UI\CommandLine.pm.mo
arvm:unhandled:114)
from C:\rakudo/share/perl6/lib/Debugger/UI/CommandLine.pm:721 (C:\rakudo\share\perl6\lib\Debugger\UI\CommandLine.pm.mo
arvm::25)
from gen/moar/m-Metamodel.nqp:3586 (C:\rakudo\share\nqp\lib/Perl6/Metamodel.moarvm:enter:28)
from gen/moar/m-CORE.setting:5190 (C:\rakudo/share/perl6/runtime/CORE.setting.moarvm:CALL-ME:57)
from gen/moar/m-BOOTSTRAP.nqp:2749 (C:\rakudo/share/nqp/lib/Perl6/BOOTSTRAP.moarvm::93)
from gen\moar\stage2\NQPHLL.nqp:1425 (C:\rakudo\share\nqp\lib/NQPHLL.moarvm:command_eval:380)
from src/Perl6/Compiler.nqp:59 (C:\rakudo\share\nqp\lib/Perl6/Compiler.moarvm:command_eval:93)
from gen\moar\stage2\NQPHLL.nqp:1365 …Run Code Online (Sandbox Code Playgroud) 我是Perl 6的新手.我的Atom编辑器中有以下代码,但我仍然不明白它是如何工作的.我复制了以下代码,正如doc.perl6.org所说,但它似乎无法正常工作.所以我把代码更改为:
use v6;
class HTTPHeader { ... }
class HTTPHeader does Associative {
has %!fields handles <self.AT-KEY self.EXISTS-KEY self.DELETE-KEY self.push
list kv keys values>;
method Str { say self.hash.fmt; }
multi method EXISTS-KEY ($key) { %!fields{normalize-key $key}:exists }
multi method DELETE-KEY ($key) { %!fields{normalize-key $key}:delete }
multi method push (*@_) { %!fields.push: @_ }
sub normalize-key ($key) { $key.subst(/\w+/, *.tc, :g) }
method AT-KEY (::?CLASS:D: $key) is rw {
my $element := %!fields{normalize-key $key};
Proxy.new(
FETCH => …Run Code Online (Sandbox Code Playgroud) 我有兴趣使用Set如下持有数组:
my @v1 = 1, 2, 3;
my @v2 = 1, 2, 3;
my $set Set.new(@v1, @v2);
Run Code Online (Sandbox Code Playgroud)
很Set容易认识到两个数组是相同的,就像~~运算符所观察到的那样,但是Set使用===运算符来比较大多数对象.
# desired outcome: set([1 2 3])
# actual outcome: set([1 2 3], [1 2 3])
Run Code Online (Sandbox Code Playgroud)
我可以在将数组添加到数组之前对其进行序列化Set,使用精彩的Set魔法,然后反序列化.这看起来很尴尬.
我可以做一个Setty使用类~~的比较.这似乎是一个很好的学习,但也许是错误的.
有没有更惯用的方法呢?
使用整数作为哈希键是否安全?
my %hash;
my $str = ...
for $str.NFC {
%hash{$_} = ...
}
Run Code Online (Sandbox Code Playgroud) 在Rakudo Perl 6中item或$可用于评估项目上下文中的表达式.请参阅https://docs.perl6.org/routine/item
我正在使用一个返回项目contextualized Array的库.删除语境化的正确方法是什么,以便将其分配给@变量?
例如:
my @a = $[<a b c>];
dd @a; # Outputs: Array @a = [["a", "b", "c"],]
Run Code Online (Sandbox Code Playgroud) 我试图通过定义和传递原始运算符来实现类似于Scheme的一些功能.在Scheme中,你可以
(define x +) (x 1 2)
Run Code Online (Sandbox Code Playgroud)
并且此操作将给出答案3.在perl6中,我不得不将操作符放在另一个函数中以实现相同的操作:
sub x($a) { $a * 2; }
sub y($m, $n) { $m($n); }
say y(&x, 3); # gives you 6
say y(+, 3) # this is error
Run Code Online (Sandbox Code Playgroud)
是否有一种简单的方法来传递运算符和函数?
谢谢.
在Perl 6中,<.before ... >正则表达式的含义是什么?它似乎意味着<?before ... >:
my $str = "Hello";
$str ~~ /<alpha> <?before 'o'>/;
say $/;
$str ~~ /<alpha> <.before 'o'>/;
say $/;
Run Code Online (Sandbox Code Playgroud)
输出:
?l?
alpha => ?l?
?l?
alpha => ?l?
Run Code Online (Sandbox Code Playgroud)
我想澄清一下,因为我看到了一些使用的代码,<.before ...>我不确定它是什么意思.它可能是非法的语法,或者它可能意味着负面的前瞻<!before ...>或积极的前瞻<?before ...>或其他.我知道我可以<alpha>通过在它前面放一个点来制定像非捕获这样的规则<.alpha>,但是对于我来说,因为它们总是无法捕获而对前瞻没有意义.在任何情况下,它应该写<.?before ... >或<.!before ... >区分正面和负面的前瞻?
最后,当我设法理解如何解决这个问题,即如何更改内部动态变量的值时,代码已经移动,现在它以这种方式声明:
my int $is-win = Rakudo::Internals.IS-WIN;
Run Code Online (Sandbox Code Playgroud)
这是在里面声明的类变量class Encoding::Builtin.因为操作系统不是在变量的生命周期中发生变化的东西,所以在世界上具有全部意义.但是,我需要从其他操作系统测试此代码,因此我需要访问该类变量并为其赋值True.我可以使用元对象协议吗?