今天我安装了Rakudo Star 2012.07并尝试编写一个简单的Perl 6脚本:
#!/usr/bin/env perl6
use v6;
use LWP::Simple;
my $html = LWP::Simple.get('http://perl6.org');
say $html;
Run Code Online (Sandbox Code Playgroud)
由于以下错误,它无法正常工作:
No such method 'get_string' for invocant of type 'String'
in method decode at src/gen/CORE.setting:6766
in method parse_response at lib/LWP/Simple.pm:244
in method make_request at lib/LWP/Simple.pm:199
in method request_shell at lib/LWP/Simple.pm:63
in method get at lib/LWP/Simple.pm:28
Run Code Online (Sandbox Code Playgroud)
第244行的LWP ::简单代码是:
my @header_lines = $resp.subbuf(
0, $header_end_pos
).decode('ascii').split(/\r\n/);
Run Code Online (Sandbox Code Playgroud)
奇怪的是,以下代码是可以的:
> Buf.new(1,2,3,4,5).decode('ascii')
Run Code Online (Sandbox Code Playgroud)
而这一次失败了:
> Buf.new(1,2,3,4,5).subbuf(0,3).decode('ascii')
Method 'get_string' not found for invocant of class 'String'
Run Code Online (Sandbox Code Playgroud)
你能解释一下,为什么会这样?据我所知,在两种情况下都调用Buf.decode方法:
> Buf.new(1,2,3,4,5).subbuf(0,3).isa('Buf')
True
> …Run Code Online (Sandbox Code Playgroud) 在Perl 6中,在for-style中声明的变量loop位于外部作用域中.这有效并且有记录.
loop ( my $n = 0; $n < 3; $n++ ) {
put $n;
}
say "Outside: $n";
Run Code Online (Sandbox Code Playgroud)
的$n是该块的外部可见:
0
1
2
Outside: 3
Run Code Online (Sandbox Code Playgroud)
这里是否存在激励技巧,使其与Perl 6的祖先所期望的不同?我没有在设计文档中看到这一点(但尝试在某个时候搜索"循环").我无法想出一个可以让事情变得更容易的例子.
在Perl 5中,同样的事情是严格的错误:
use v5.10;
use strict;
for ( my $n = 0; $n < 3; $n++ ) {
put $n;
}
say "Outside: $n"; # Nope!
Run Code Online (Sandbox Code Playgroud)
而且,在C(那些让你这样做),这是一个类似的错误:
#include <stdio.h>
int main () {
for( int a = 10; a < 20; a = a + 1 …Run Code Online (Sandbox Code Playgroud) 如果您知道其索引,则可以使用Perl 6中的副词:delete删除数组元素:
my @letters = <a b c>; @letters[0]:delete; say @letters
# OUTPUT: «[(Any) b c]?»
Run Code Online (Sandbox Code Playgroud)
但是,如果您不知道索引,则无法执行此操作:
my @letters = <a b c>; $_:delete if $elem eq 'a' for @letters
#ERROR! ? Variable '$_:delete' is not declared
Run Code Online (Sandbox Code Playgroud)
如果声明循环变量is rw仍然是同一个问题:
my @letters = <a b c>; for @letters -> $l is rw { $l:delete if $l eq 'a' }; say @letters
#ERROR! ? Variable '$l:delete' is not declared
Run Code Online (Sandbox Code Playgroud)
似乎没有其他方法可以删除数组元素.该等效Perl 5的delete点,实际上,该副词.你可以使用,splice但你必须再次知道索引.实现似乎是这个函数, …
我想创建一个Perl 6模块,它将一个LEAVE移相器"导出" 到use放置语句的作用域.我还没有办法做到这一点.
我认为这需要在EXPORT子内部完成,但如何?EXPORTsub 的默认功能是返回一个Map名称=>要导出的事物的对象映射.据我所知,没有办法反省外部范围.或者我错过了什么?
我试图从使用常规代码的用户输入中获取列表,但是由于以下错误,有时它会意外失败:
This type cannot unbox to a native integer: P6opaque, Str
Run Code Online (Sandbox Code Playgroud)
代码行是
my @a = prompt("Enter list: ").words || (1,2,3);
Run Code Online (Sandbox Code Playgroud)
仅当我仅输入一个数字时,它才会失败。
什么时候在没有用户意识的情况下将Str转换为“ P6opaque,Str”?我不能使用+ @ a [0]或@a [0] .Int将此“ P6opaque,Str”转换为Int。我在这里想念什么?
非常感谢您的帮助 !!!
赖脯
声明原型时,可以在多方法/子代码周围附加其他代码。举一个愚蠢的例子:
proto sub foo(|) { 'Camelia says “' ~ {*} ~ '!”' }
multi sub foo(1) { "hi" }
multi sub foo($) { "bye" }
say foo(1) # Camelia says “hi!”
Run Code Online (Sandbox Code Playgroud)
我还没有遇到任何时间(还)在那里我已经感到的巨大有用的,但在另一面,我已经在那里正则表达式中遇到一些/语法的世界里,我偶尔发现自己重复自己在所有的原令牌-这并不是说我不能转移到单独的令牌中,而是增加了层次结构和操作的额外层。比较假设
grammar Bar {
token TOP { <meta>* }
token metastart { '#' }
proto token meta { <metastart> {*} }
token meta:name { ( \w* ) }
token meta:date { (\d**6) }
}
Run Code Online (Sandbox Code Playgroud)
在那里他们只是操作方法除了需要TOP将meta:name与meta:date以
grammar Bar {
token TOP { …Run Code Online (Sandbox Code Playgroud) 该文件指出,“运行块地方不能是独立的语句最简单的方法是通过编写do之前”,并提供了下面的例子:
# This dies half of the time
do { say "Heads I win, tails I die."; Bool.pick } or die; say "I win.";
Run Code Online (Sandbox Code Playgroud)
但是,do似乎不会导致所有块都运行。特别是,它似乎没有运行带有签名的块:
do -> $a = 42 { say "ran with $a"; 0 } or die; say 'done'; # OUTPUT: «done»
Run Code Online (Sandbox Code Playgroud)
那么将do块视为有时会导致它运行的表达式会更好吗?还是乐堂在这里的行为不正确?还是我的理解不正确?
文档说fmt
\n\n返回一个字符串,其中列表中的每个元素均已根据
\n$format[第一个参数] 进行格式化,并且每个元素均由$separator[第二个参数] 分隔。
根据该描述,我希望能够调用.fmt列表列表,然后传递一个printf-style 格式字符串,其中%包含内部列表中每个元素的指令。但这是行不通的。
如果您告诉我我对 ^^^^ 的看法是错误的,我会期望它.fmt会自动展平其参数,因此每个参数都会被格式化并由$separator. 但事实并非如此。
相反,运行此代码
\n\nsay (<a b c>, <1 2 3>, <X Y Z>).fmt(\'\xe2\x86\x92%03s|\', "\\n=================\\n");\nRun Code Online (Sandbox Code Playgroud)\n产生这个输出:
\n\xe2\x86\x9200a| \xe2\x86\x9200b| \xe2\x86\x9200c|\n=================\n\xe2\x86\x92001| \xe2\x86\x92002| \xe2\x86\x92003|\n=================\n\xe2\x86\x9200X| \xe2\x86\x9200Y| \xe2\x86\x9200Z|\nRun Code Online (Sandbox Code Playgroud)\n也就是说,格式字符串应用于内部列表中的每个元素,然后对这些列表进行字符串化(不使用格式字符串;注意 每个|和\xe2\x86\x92字符之间),然后在每个外部列表之间插入分隔符列表之间插入分隔符。
这给我留下了三个问题:
\n我有一个函数,我希望能够向其中传递一个列表列表,就像这个人为的例子一样:
sub print_lists(@input) {
.say for @input
}
my @list_of_two_lists = ((1, 2), (3, 4));
print_lists(@list_of_two_lists);
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,这给出了以下输出:
(1, 2)
(3, 4)
Run Code Online (Sandbox Code Playgroud)
但如果我这样做:
my @list_of_one_list = ((1, 2));
print_lists(@list_of_one_list);
Run Code Online (Sandbox Code Playgroud)
我得到这个输出:
1
2
Run Code Online (Sandbox Code Playgroud)
即,它将包含两个元素的一个列表的列表展平为两个元素的单个列表。
我究竟做错了什么?如果我希望能够传入包含单个列表的列表,我需要做什么?
如果一个 try{} 块中发生多个异常,并且该 try{} 块内只有一个 CATCH{} 块,那么该 CATCH{} 块是否可以捕获任何/所有异常?或者我是否需要针对每个可能的异常使用一个 CATCH{}?
try { CATCH { default { say "seenError" }; }; die "1"; die "2"; die "3" }
seenError
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,哪个“die”语句被捕获了?第一?如果我想处理每个异常,是否需要将每个可能的异常包含在一个单独的 CATCH{} 中?
raku ×7
perl6 ×6
rakudo ×3
arrays ×1
do-notation ×1
exception ×1
expression ×1
for-loop ×1
formatting ×1
grammar ×1
loops ×1
nested-lists ×1
p6opaque ×1
printf ×1
rakudo-star ×1
regex ×1
string ×1