使用^=运算符时,程序永远不会终止,也不会产生结果.难道我做错了什么?
为了检查我是否可以重现这个,我使用了这个可工作的,可验证的例子:
my $k = 1;
$k ^= 24;
say $k;
Run Code Online (Sandbox Code Playgroud)
除此之外,我甚至尝试过:$k = $k ^ 24;- 但这仍然会产生同样的问题.
我正在尝试使用Perl6语法实现Markdown解析器并且遇到了blockquotes.块引用段落不能嵌套括号来表示,因为它是专门格式化行的列表.但从语义上讲,它是一个嵌套的降价.
基本上,这一切都归结为以下定义:
token mdBlockquote {
<mdBQLine>+ {
my $quoted = [~] $m<mdBQLine>.map: { $_<mdBQLineBody> };
}
}
Run Code Online (Sandbox Code Playgroud)
mdBQLine令牌的实际实现与此无关.唯一需要注意的是,mdBQLineBody密钥包含>已经剥离的实际引用行.毕竟,对于一个块:
> # quote1
> quote2
>
> quote3
quote3.1
Run Code Online (Sandbox Code Playgroud)
该$quoted标将包含:
# quote1
quote2
quote3
quote3.1
Run Code Online (Sandbox Code Playgroud)
现在,重点是解析上述数据并将其注入Match对象$/.这就是我完全陷入困境的地方.最明显的解决方案:
token mdBlockquote {
<mdBQLine>+ {
my $quoted = [~] $m<mdBQLine>.map: { $_<mdBQLineBody> };
$<mdBQParsed> = self.parse( $quoted, actions => self.actions );
}
}
Run Code Online (Sandbox Code Playgroud)
一次失败有两个原因:第一,$/是一个只读对象; 第二,.parse有效地修改它使得无法向原始树中注入任何东西.
是否有任何解决方案,然后分析解析数据,提取和重新解析blockquotes,重复......?
race将iterable上的操作自动划分为线程.例如,
(Bool.roll xx 2000).race.sum
Run Code Online (Sandbox Code Playgroud)
会自动将2000长阵列的总和分成4个线程.但是,基准测试显示,这比race没有使用时要慢得多.即使您使阵列更大,也会发生这种情况.即使非自动编程版本随每个版本变得越来越快,也会发生这种情况.(自动线程也变得更快,但仍然是不使用它的两倍.)
所以问题是:值得使用的原子操作的最小大小是多少?添加到顺序操作的开销是固定的还是可以某种方式降低?
更新:实际上,性能hyper(类似于种族,但有保证的有序结果)似乎随着时间的推移而变得越来越差,至少对于小尺寸而言,它们仍然是默认批量大小的整数倍(64).同样的情况与race
为变量分配迭代器显然Seq会改变行为.例如
use v6;
my $i = '/etc/lsb-release'.IO.lines;
say $i.WHAT;
say '/etc/lsb-release'.IO.lines.WHAT;
.say for $i;
.say for '/etc/lsb-release'.IO.lines;
Run Code Online (Sandbox Code Playgroud)
结果是:
(Seq)
(Seq)
(DISTRIB_ID=Ubuntu DISTRIB_RELEASE=18.04 DISTRIB_CODENAME=bionic DISTRIB_DESCRIPTION="Ubuntu 18.04.1 LTS")
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.1 LTS"
Run Code Online (Sandbox Code Playgroud)
所以一旦分配,我只得到序列的字符串表示.我知道我可以使用.say for $i.lines相同的输出,但我不明白分配和未分配的迭代器/ Seq之间的区别.
在Perl中,,运算符可用于连接列表; 但是,Perl 6并未在此上下文中压缩列表,从而导致列表中包含两个列表.连接列表需要使用|滑动操作符.
my @a = <a b c>;
my @b = <d e f>;
my @ab = |@a, |@b;
Run Code Online (Sandbox Code Playgroud)
这个操作有什么简写吗?
我已经定义了一个新类型Tuple如下:
subset Tuple of Array where { .elems == 2 && .[0] < .[1] };
my Tuple $t = [1, 2];
say $t; # [1 2] So far, so good.
Run Code Online (Sandbox Code Playgroud)
我无法使用更短或更长的阵列或[2, 1]正如预期的那样初始化它.但是,我可以补充一下:
$t.append(3);
say $t; # [1 2 3] Ouch!
Run Code Online (Sandbox Code Playgroud)
怎么可能?
在呐喊下奔跑(2016.10)
考虑构造一个集合并测试成员资格的代码:
my $num_set = set( < 1 2 3 4 > );
say "set: ", $num_set.perl;
say "4 is in set: ", 4 ? $num_set;
say "IntStr 4 is in set: ", IntStr.new(4, "Four") ? $num_set;
say "IntStr(4,...) is 4: ", IntStr.new(4, "Four") == 4;
say "5 is in set: ", 5 ? $num_set;
Run Code Online (Sandbox Code Playgroud)
直接4不在集合中,但IntStr版本是:
set: set(IntStr.new(4, "4"),IntStr.new(1, "1"),IntStr.new(2, "2"),IntStr.new(3, "3"))
4 is in set: False
IntStr 4 is in set: True
IntStr(4,...) is 4: …Run Code Online (Sandbox Code Playgroud) 我需要对一组数组进行排序; .sort方法似乎默认工作.但是根据内部数组的不同索引排序的好方法是什么?
要排序的数组是更大的数组:('mmddyy'格式的生日)
my @allRecords = [ [birthday1 firstName1 lastName1 [data1]
[birthday2 firstName2 lastName2 [data2]
...
[birthdayN firstNameN lastNameN [dataN] ];
@allRecords.sort by itself sorts by birthdays.
Run Code Online (Sandbox Code Playgroud)
什么是通过firstName或lastName或内部数组内的数据排序的更好方法?
非常感谢你!
我有一些Perl 6测试,从一些基本测试开始,我把类名称在变量中测试,在整个测试中使用该变量:
my $package = 'Some::Class';
use-ok $package;
my $class = ::($package);
can-ok $class, 'new';
Run Code Online (Sandbox Code Playgroud)
我没有注意到这一点,但它不再有效,因为类现在被词法加载:
没有这样的符号'Some :: Class'
这不是一个难题.在没有use-ok和我想要的范围内加载模块::($package):
use Some::Class;
...
Run Code Online (Sandbox Code Playgroud)
其他解决方案(EVAL或许是一个丑陋的折扣)有我试图避免的问题.
但是,我并不特别喜欢,因为该名称在文件中出现两次.我特别喜欢我从Perl 5继承的以前工作的习语.如果我想更改一个类名,它只会在文件中出现一次.我可以很容易地生成样板测试(尽管,修复并不是那么难).
有没有办法可以回到我想要的理想状态?(虽然我认为下一个版本中的词法加载会再次妨碍).
我正在尝试封装一个C结构,其中一个成员是一个指向结构的指针数组,而我在弄清楚如何执行它时遇到了问题.
假设C代码如下所示:
struct foo
{
unsigned char a;
};
struct bar
{
struct foo *f[5];
};
Run Code Online (Sandbox Code Playgroud)
这种代码有效:
use NativeCall;
class foo is repr('CStruct') {
has uint8 $.a;
}
class bar is repr('CStruct') {
has foo $.f1;
has foo $.f2;
has foo $.f3;
has foo $.f4;
has foo $.f5;
}
Run Code Online (Sandbox Code Playgroud)
但它太可怕了.
A CArray在这里没用,因为它只是一个指向数组的指针,而不是一个指针数组; 我不能使用类似的东西has A @.a,因为a repr('CStruct')不处理那种属性.
任何提示?