今天,我安装了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;
由于以下错误,它不起作用:
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
LWP::Simple在第244行的代码是:
my @header_lines = $resp.subbuf(
0, $header_end_pos
).decode('ascii').split(/\r\n/);
奇怪的是,以下代码可以:
> Buf.new(1,2,3,4,5).decode('ascii')
虽然这失败了:
> Buf.new(1,2,3,4,5).subbuf(0,3).decode('ascii')
Method 'get_string' not found for invocant of class 'String'
您能解释一下为什么发生吗?据我所知,在两种情况下都调用Buf.decode方法:
> Buf.new(1,2,3,4,5).subbuf(0,3).isa('Buf')
True
> Buf.new(1,2,3,4,5).isa('Buf')
True
也许这是Rakudo Perl中的错误?还是subbuf是已弃用/未记录的方法?在doc.perl6.org上不存在。在这种情况下,应使用哪种方法?
最佳答案
这是Rakudo中的一个错误,该错误已在最新的开发版本中修复
$ perl6 -e 'say Buf.new(1,2,3,4,5).subbuf(0,3).decode("ascii")'|hexdump -C
00000000 01 02 03 0a |....|
(我很确定修复程序也是Rakudo 2012.08发行版,基于编译器的Rakudo Star发行版将在本周发布)。
它尚未被记录的原因是,我专注于规范中的那些方法,因为它们有更高的生存机会。我希望很快就可以添加文档。
更新:了解它,请参阅http://doc.perl6.org/type/Buf#subbuf