我已经阅读了规范,但我仍然很困惑my class与[our] class. 有什么区别以及何时使用哪个?
我开始编写BibTeX解析器.我想做的第一件事是解析一个支撑项目.例如,支撑项可以是作者字段或标题.字段中可能有嵌套的大括号.下面的代码并没有处理嵌套括号:
use v6;
my $str = q:to/END/;
author={Belayneh, M. and Geiger, S. and Matth{\"{a}}i, S.K.},
END
$str .= chomp;
grammar ExtractBraced {
rule TOP {
'author=' <braced-item> .*
}
rule braced-item { '{' <-[}]>* '}' }
}
ExtractBraced.parse( $str ).say;
Run Code Online (Sandbox Code Playgroud)
输出:
?author={Belayneh, M. and Geiger, S. and Matth{\"{a}}i, S.K.},?
braced-item => ?{Belayneh, M. and Geiger, S. and Matth{\"{a}?
Run Code Online (Sandbox Code Playgroud)
现在,为了使解析器接受嵌套大括号,我想保留当前解析的开括号数量的计数器,当遇到右大括号时,我们减少计数器.如果计数器达到零,我们假设我们已经解析了完整的项目.
为了遵循这个想法,我尝试拆分braced-item正则表达式,对每个char实现语法操作.(braced-item-char下面正则表达式的操作方法应该处理大括号计数器):
grammar ExtractBraced {
rule TOP {
'author=' <braced-item> .*
}
rule braced-item { …Run Code Online (Sandbox Code Playgroud) 试图与一个 C 库接口,该库采用一个带有一堆指向它在不同点调用的函数的指针的结构。
像这样:
struct callbacks {
int (*foo)(int);
int (*bar)(int);
}
int set_callbacks(callbacks *cbs);
Run Code Online (Sandbox Code Playgroud)
我可以进行回调:
sub foo-callback(int32 --> int32) {...}
sub bar-callback(int32 --> int32) {...}
Run Code Online (Sandbox Code Playgroud)
如果这样做会很酷:
class Callbacks is repr<CStruct>
{
has &.foo (int32 --> int32);
has &.bar (int32 --> int32);
}
Run Code Online (Sandbox Code Playgroud)
但事实并非如此。我正在尝试做一些事情:
class Callbacks is repr<CStruct>
{
has Pointer $.foo;
has Pointer $.bar;
}
Run Code Online (Sandbox Code Playgroud)
并将它们设置为nativecast(Pointer, &foo-callback)或一些,但我似乎无法强迫它们在那里。
除了编写一个小 C 函数来获取所有 Perl 6 函数指针并将它们插入 C 中的结构之外,还有什么方法可以做到这一点?
一些背景:我想扩展JSON::Tiny以允许更轻松的列表解析.这类似于Perl 5中的relaxed标志JSON::XS.具体来说,我希望可以选择在列表末尾添加逗号.例如,{ "a" : 1, "b" : 2, }.注意之后的逗号2,正常的JSON语法规范(或JSON::Tiny)不允许这样做.
通过检查源代码,它似乎可以像扩展其中一个模块JSON :: Tiny :: Grammar一样简单,它JSON::Tiny在内部使用,然后覆盖其两个规则:
grammar JSON::Relaxed::Grammar is JSON::Tiny::Grammar {
rule pairlist { <pair> * %% \, } # override this rule
rule arraylist { <value> * %% [ \, ] } #overide this rule
}
Run Code Online (Sandbox Code Playgroud)
请注意,唯一的修改JSON::Tiny::Grammar是引入%%运算符而不是%操作符pairlist和arraylist规则.
这样的扩展将允许代码重用.(复制所有代码的替代方案JSON::Tiny是最后的选择.)
问题:现在的问题是如何在 …
假设我有这个脚本:
# prog.p6
my $info = run "uname";
Run Code Online (Sandbox Code Playgroud)
当我跑步时prog.p6,我得到:
$ perl6 prog.p6
Linux
Run Code Online (Sandbox Code Playgroud)
有没有办法存储返回值的字符串版本并阻止它输出到终端?
已经存在类似的问题,但它没有提供具体的答案.
在尝试提出一些解决此问题的示例时,我提出了以下代码段:
my regex key {^^ <![#-]> \d+ }
say "333" ~~ &key; # OUTPUT: «?333??»
say "#333" ~~ &key;
say '333$' ~~ m/ \d+ <?[$]>/; # OUTPUT: «?333??»
say '333' ~~ m/ \d+ <?[$]>/;
say '$333' ~~ m/<?[$]> \d+ /;
Run Code Online (Sandbox Code Playgroud)
只有表示为return的语句?333?似乎<! >可以用作先行断言,而<? >只能用作零宽度后向断言。是这样吗 如果是这样,创建正向超前断言和负向向后断言的方式是什么?
当我在逗号中启动新项目时,它会弹出我要使用的版本。除了允许我从rakudobrew列表中的每个版本中进行选择之外,还有一个选项,它不是我在命令行中选择的选项。当我运行脚本时,它找不到已安装的模块。那我怎么能
我当然可以摆脱逗号,更改全局Rakudo版本,安装模块,然后返回到我正在使用的任何版本,但是我想知道如何从逗号本身中做到这一点。
我正在尝试做的是允许程序根据遇到的文本来定义字符类。但是,<[]>从字面上接受字符,并且以下产生错误:
my $all1Line = slurp "htmlFile";
my @a = ($all1Line ~~ m:g/ (\" || \') ~ $0 {} :my $marker = $0; http <-[ $marker ]>*? page <-[ $marker ]>*? /); # error: $marker is taken literally as $ m a r k e r
Run Code Online (Sandbox Code Playgroud)
我想匹配所有格式为“ https:// foo?page = 0?ssl = 1 ”或“ http ... page ...”的链接
非常感谢你!
尽管实际上你可以详细列举任何类型的数据结构,以适应它变成一个标量,sigilless变量可能有一定的内在价值,因为它们实际上不成形,用作类的属性。但是,似乎没有办法这样做,has \.a也不起作用has .\a。A has $!a可能涵盖了我们使用无符号变量可以实现的大部分功能,但是是否存在将它们用作属性的实际方法?
当我执行此程序时:
use Test;
use NativeCall;
constant LIB = ('gsl', v23);
sub gsl_sf_airy_Ai(num64 $x, uint32 $mode --> num64) is native(LIB) is export { * }
sub Ai(Numeric $x, UInt $mode --> Num) is export { gsl_sf_airy_Ai($x.Num, $mode) }
ok Ai(0, 0) == 0.3550280538878172, 'Ai 1';
ok gsl_sf_airy_Ai(0e0, 0) == 0.3550280538878172, 'Ai 2';
Run Code Online (Sandbox Code Playgroud)
即使我以这种方式交换两个“确定”的测试,测试也可以正常工作:
ok gsl_sf_airy_Ai(0e0, 0) == 0.3550280538878172, 'Ai 2';
ok Ai(0, 0) == 0.3550280538878172, 'Ai 1';
Run Code Online (Sandbox Code Playgroud)
如果我将声明移至模块:
unit module mymodule;
use NativeCall;
constant LIB = ('gsl', v23);
sub gsl_sf_airy_Ai(num64 $x, …Run Code Online (Sandbox Code Playgroud) raku ×10
perl6 ×6
grammar ×2
commaide ×1
inheritance ×1
nativecall ×1
object ×1
regex ×1
syntax ×1
testing ×1
user-defined ×1
variables ×1