小编Eli*_*sen的帖子

Buf.subbuf在Perl 6中的奇怪行为

今天我安装了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)

rakudo perl6 rakudo-star raku

8
推荐指数
1
解决办法
208
查看次数

为什么Perl 6的循环变量声明在外部范围内?

在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)

loops for-loop perl6

8
推荐指数
1
解决办法
292
查看次数

如果你不知道它的索引,删除数组元素的语法是什么?

如果您知道其索引,则可以使用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但你必须再次知道索引.实现似乎是这个函数, …

arrays perl6

8
推荐指数
2
解决办法
275
查看次数

如何将LEAVE相位器导出到use语句的外部范围

我想创建一个Perl 6模块,它将一个LEAVE移相器"导出" 到use放置语句的作用域.我还没有办法做到这一点.

我认为这需要在EXPORT子内部完成,但如何?EXPORTsub 的默认功能是返回一个Map名称=>要导出的事物的对象映射.据我所知,没有办法反省外部范围.或者我错过了什么?

perl6

8
推荐指数
1
解决办法
144
查看次数

perl6“ P6opaque,Str”与简单的“ Str”类型

我试图从使用常规代码的用户输入中获取列表,但是由于以下错误,有时它会意外失败:

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。我在这里想念什么?

非常感谢您的帮助 !!!

赖脯

string perl6 raku p6opaque

8
推荐指数
1
解决办法
110
查看次数

为什么在Perl 6语法原型中没有任何内容?

声明原型时,可以在多方法/子代码周围附加其他代码。举一个愚蠢的例子:

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)

在那里他们只是操作方法除了需要TOPmeta:namemeta:date

grammar Bar { 
   token TOP { …
Run Code Online (Sandbox Code Playgroud)

regex grammar perl6 raku

8
推荐指数
1
解决办法
117
查看次数

`do` 关键字是运行块还是将其视为表达式?

文件指出,“运行块地方不能是独立的语句最简单的方法是通过编写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块视为有时会导致它运行的表达式会更好吗?还是乐堂在这里的行为不正确?还是我的理解不正确?

expression rakudo do-notation raku

8
推荐指数
1
解决办法
129
查看次数

混淆 .fmt 行为与嵌套列表

文档说fmt

\n
\n

返回一个字符串,其中列表中的每个元素均已根据$format[第一个参数] 进行格式化,并且每个元素均由$separator[第二个参数] 分隔。

\n
\n

根据该描述,我希望能够调用.fmt列表列表,然后传递一个printf-style 格式字符串,其中%包含内部列表中每个元素的指令。但这是行不通的。

\n

如果您告诉我我对 ^^^^ 的看法是错误的,我会期望它.fmt会自动展平其参数,因此每个参数都会被格式化并由$separator. 但事实并非如此。

\n

相反,运行此代码

\n
\nsay (<a b c>, <1 2 3>, <X Y Z>).fmt(\'\xe2\x86\x92%03s|\', "\\n=================\\n");\n
Run 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|\n
Run Code Online (Sandbox Code Playgroud)\n

也就是说,格式字符串应用于内部列表中的每个元素,然后对这些列表进行字符串化(使用格式字符串;注意 每个|\xe2\x86\x92字符之间),然后在每个外部列表之间插入分隔符列表之间插入分隔符。

\n

这给我留下了三个问题:

\n
    \n
  1. 我是否正确描述/理解了当前的行为?[编辑:不。见下文]
  2. \n
  3. 这种行为是故意的还是奇怪的错误?(我检查了 Roast,但没有看到任何东西)
  4. \n
  5. 假设这是故意的,为什么?有什么方法可以使这与 …

formatting printf nested-lists rakudo raku

8
推荐指数
1
解决办法
185
查看次数

如何阻止 Raku 折叠包含单个列表的列表?

我有一个函数,我希望能够向其中传递一个列表列表,就像这个人为的例子一样:

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)

即,它将包含两个元素的一个列表的列表展平为两个元素的单个列表。

我究竟做错了什么?如果我希望能够传入包含单个列表的列表,我需要做什么?

raku

8
推荐指数
1
解决办法
144
查看次数

一个 CATCH 块捕获多少个异常?

如果一个 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{} 中?

exception raku

8
推荐指数
1
解决办法
120
查看次数