我们可以使用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) 如果我有一个公共的方法,我可以同时使用调用它的类中$.name
和self.name
:
class TEST {
has Int $.a;
method b($x) {
return $!a * $x;
}
method c($y) {
return self.b($y) * 3; # or $.b($y)
}
}
my $m = TEST.new(a => 10);
say $m.c(2); # 60
Run Code Online (Sandbox Code Playgroud)
但是,如果我创建b
一个私有方法,我只能调用它self!b
,而不是$!b
,否则我收到以下错误消息:
Attribute $!b not declared in class TEST
Run Code Online (Sandbox Code Playgroud)
这条规则背后的原因是什么?在自己的类中调用方法的规则是什么?
怎么做正确?
> sub adding(:$first, :$second) { $first + $second }
> adding(second => 2, first => 1)
3
> my %param = second => 2, first => 1
{first => 1, second => 2}
> adding(%param)
Too many positionals passed; expected 0 arguments but got 1
in sub adding at <unknown file> line 1
in block <unit> at <unknown file> line 1
Run Code Online (Sandbox Code Playgroud) 如果我们有一个八进制数,例如0o157
,Perl 6可以将其转换为十进制:
> 0o157
111
Run Code Online (Sandbox Code Playgroud)
我们不允许以o
八进制表示删除它:
> 0157
Potential difficulties:
Leading 0 has no meaning. If you meant to create an octal number, use '0o' prefix; like, '0o157'. If you meant to create a string, please add quotation marks.
------> 0157?<EOL>
Run Code Online (Sandbox Code Playgroud)
现在让我们进行从十进制到八进制的反向转换:
> printf "%#o\n", 111
0157
Run Code Online (Sandbox Code Playgroud)
现在的问题是:为什么不现在就在o
之后0
的八进制表示?
同时,如果我们转换为十六进制,那x
将是:
> printf "%#x\n", 111
0x6f
Run Code Online (Sandbox Code Playgroud) 我想知道(记住Perl 6有你想要的一切),是否有一些内置仪器可以帮助产生列表的所有非空子集(顺序无关紧要).
例如,我有一个清单:
my @a = 1, 2, 3;
Run Code Online (Sandbox Code Playgroud)
我需要一个函数,f
以便f(@a)
产生:
((1), (2), (3), (1, 2), (1, 3), (2, 3), (1, 2, 3))
Run Code Online (Sandbox Code Playgroud) 这可能是一个天真的,甚至不是一个有效的问题......
我已经制作了一个Perl 6程序(希望能够创建其他几个程序),该程序会考虑一些用户定义的参数来分析本地数据.我的几个同事/同事需要定期输出程序,所以他们给我发送参数,我运行程序并将它们发回输出.
由于整个过程不是很方便,我正在考虑可以做些什么来让每个人都更容易.以下是选项,它们似乎都不理想.
所以,我的问题是:是否有可能以某种方式使Perl 6在线工作?它可以在浏览器中工作吗?或者还有其他解决方案吗?
这里发生的事情我不太明白.
> my @arr = <ac bc abc>
> @arr.grep: (( * ~~ /a/ ) && ( * ~~ /b/ ))
(bc abc)
Run Code Online (Sandbox Code Playgroud)
但
> @arr.grep(* ~~ /a/).grep(* ~~ /b/)
(abc)
Run Code Online (Sandbox Code Playgroud)
什么原因?
如果条件if
为False
,而不是空输出,则REPL给出()
(空List
?)
> put 1 if True
1
> put 1 if False
() # ? What is this?
Run Code Online (Sandbox Code Playgroud)
什么()
意思?
当我声明一个变量,其值属于内置类时,我只是写
my Int $a;
Run Code Online (Sandbox Code Playgroud)
但是当我想使用用户定义的类时,我必须使用 Classname.new
.
my class House {
has $.area is rw;
}
my $house1 = House.new;
$house1.area = 200;
say $house1.area;
Run Code Online (Sandbox Code Playgroud)
所以,我天真的问题是,这种差异的原因是什么?为什么我们不能简单地写my House $house1
?
我的最终目标是使用一个数组,其值是用户定义的类的实例.如何正确执行以下操作?
my @houses ...;
@houses[10].area = 222;
Run Code Online (Sandbox Code Playgroud) 我正在尝试阅读下载的html文件
my $file = "sn.html";
my $in_fh = open $file, :r;
my $text = $in_fh.slurp;
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息:
Malformed UTF-8
in block <unit> at prog.p6 line 10
Run Code Online (Sandbox Code Playgroud)
如何避免这种情况并访问文件的内容?