我正试图在Perl 6中感到舒服.当我在REPL提示符下时,我在Python中发现的一件事就是我可以做一个dir(对象)并找出一个对象的属性,在Python中包含对象的方法.
这通常有助于提醒我想做什么; "哦,这是正确的,Python中的修剪被称为条带",就像那样.
在Perl 6中,我知道内省方法.WHO,.WHAT,.WHICH,.HOW和.WHY,但这些是在类或对象级别.我如何找出对象内部的内容,以及我可以对它做些什么?
我正在浏览例程中的Perl 6文档shift并看到了这个片段:
定义为:
Run Code Online (Sandbox Code Playgroud)multi sub shift(Array:D ) multi method shift(Array:D:)
我知道:D指的Array就是defined不Any和Nil,但有什么:D:?搜索起来非常困难.
类型签名文档的这一部分包含更多语法示例,但没有(据我所知)解释它.
我以为在互联网上的某个地方会有一个简单的答案,但似乎我找不到解决方案.我首先想知道是否有一个简单的方法或功能:
例如,~~或array.contains()来自Perl 5
在Perl 6中有多少不同的方法可以实现这一结果也很好,因为考虑到问题的情况,有些方法可能比其他方法更好.
我们可以使用reduce带有sub两个参数,将它放在双括号中:
> sub mysum { $^a + $^b }
> [[&mysum]] 1,3,5
9
Run Code Online (Sandbox Code Playgroud)
但是如果我们想要使用匿名函数呢?
以下两个变体都会产生编译错误:
> [[&{ $^a + $^b }]] 1,3,5
> [[{ $^a + $^b }]] 1,3,5
Run Code Online (Sandbox Code Playgroud) 上周我决定尝试Perl6并开始重新实现我的一个程序.我不得不说,Perl6对于对象编程来说非常简单,这在Perl5中对我来说非常痛苦.
我的程序必须读取和存储大文件,例如全基因组(高达3 Gb或更高,参见下面的示例1)或制表数据.
代码的第一个版本是通过逐行迭代("genome.fa".IO.lines)以Perl5方式制作的.对于正确的执行时间来说,它非常缓慢且无法确定.
my class fasta {
has Str $.file is required;
has %!seq;
submethod TWEAK() {
my $id;
my $s;
for $!file.IO.lines -> $line {
if $line ~~ /^\>/ {
say $id;
if $id.defined {
%!seq{$id} = sequence.new(id => $id, seq => $s);
}
my $l = $line;
$l ~~ s:g/^\>//;
$id = $l;
$s = "";
}
else {
$s ~= $line;
}
}
%!seq{$id} = sequence.new(id => $id, seq => $s);
}
}
sub MAIN()
{ …Run Code Online (Sandbox Code Playgroud) 是否有一种简单的方法可以将定义常量的值用作Perl6中的散列/对键?
例如 :
constant KEY = "a string";
my %h = ( KEY => "a value" );
Run Code Online (Sandbox Code Playgroud)
这将创建"KEY"而不是"字符串"的键.
我可以 :
my %h = ( "{KEY}" => "a value" );
Run Code Online (Sandbox Code Playgroud)
但这似乎有点笨重.我想知道是否有更好的方法?
我已经整理了文档,但似乎找不到在perl6中执行此操作的方法。
在perl5中,我会做的(只是一个例子):
sub func { ... }
$str =~ s/needle/func($1)/e;
Run Code Online (Sandbox Code Playgroud)
即用对“ func”的调用输出替换“ needle”
我试图重载or自定义类的逻辑运算符,但它似乎不起作用。这是我的工作:
class A { has $.a }
multi sub infix:<or> (A $a, A $b) {
"works!({$a.a}, {$b.a})"
}
say A.new(:1a) or A.new(:2a);
Run Code Online (Sandbox Code Playgroud)
我期望将其works!(1, 2)作为输出获取,但我会获取A.new(a => 1),这是标准or运算符的结果。
其他运算符(and和除外xor)似乎对我有用:
class A { has $.a }
multi sub infix:<anything-else> (A $a, A $b) {
"works!({$a.a}, {$b.a})"
}
say A.new(:1a) anything-else A.new(:2a);
Run Code Online (Sandbox Code Playgroud)
结果works!(1, 2)。
我是不是做错了什么或有只是没有办法超载的标准or,and,xor运营商?
我有两个Perl 6文件:
hello.p6:
sub hello
{
say 'hello';
}
Run Code Online (Sandbox Code Playgroud)
和main.p6:
require 'hello.p6';
hello();
Run Code Online (Sandbox Code Playgroud)
但是不要工作.如何在主脚本中包含第一个文件?
我不明白这种行为:
> sort([1,2,3,4]) ~~ sort([1,2,3,4])
False
Run Code Online (Sandbox Code Playgroud)
你能解释一下吗?根据Perl 6,为什么这两个列表(显然相等)不相等.
更新
有趣,但它取决于Perl6版本(我刚刚注意到它):
$ which perl6
/usr/bin/perl6
$ dpkg -S `which perl6`
rakudo: /usr/bin/perl6
$ perl6 --version
This is perl6 version 2015.11 built on MoarVM version 2015.11
$ perl6
> sort([1,2,3]) ~~ sort([1,2,3])
True
>
$ export PATH=~/.rakudobrew/bin:$PATH
$ perl6 --version
This is Rakudo version 2017.12 built on MoarVM version 2017.12.1
implementing Perl 6.c.
$ perl6
To exit type 'exit' or '^D'
> sort([1,2,3]) ~~ sort([1,2,3])
False
>
Run Code Online (Sandbox Code Playgroud)
从#perl6的讨论开始:
[19:35] <+committable6> AlexDaniel,
¦2015.12,2016.01.1,2016.02,2016.03,2016.04,2016.05,2016.06,2016.07.1,2016.08.1,2016.09,2016.10,2016.11,2016.12: …Run Code Online (Sandbox Code Playgroud) perl6 ×10
raku ×6
arrays ×1
containers ×1
evaluation ×1
fasta ×1
grammar ×1
list ×1
operators ×1
parsing ×1
performance ×1
perl-module ×1
regex ×1
replace ×1
syntax ×1