小编msc*_*cha的帖子

在 Raku 中查找重复数字的优雅方法(née Perl 6)

我试图在一个数字中找到一组重复的数字,例如12334555611变成(1 2 33 4 555 6 11).

这有效:

$n.comb(/ 0+ | 1+ | 2+ | 3+ | 4+ | 5+ | 6+ | 7+ | 8+ | 9+ /)
Run Code Online (Sandbox Code Playgroud)

但不是很优雅。

有一个更好的方法吗?

regex raku

7
推荐指数
2
解决办法
143
查看次数

如何在Perl 6中使用非缓存无限延迟列表

无限懒惰列表真棒!

> my @fibo = 0, 1, *+* ... *;
> say @fibo[1000];
43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875
Run Code Online (Sandbox Code Playgroud)

它们会自动缓存它们的值,这在大多数情况下都很方便.但是当使用巨大的Fibonacci数字(例子)时,这可能会导致内存问题.

不幸的是,我无法弄清楚如何创建非缓存Fibonacci序列.任何人?

perl6

6
推荐指数
2
解决办法
185
查看次数

Perl 6:检查元素是否在列表中的最佳方法是什么?

假设我有一个大数组,@stuff和a $thing,我想知道是否$thing@stuff.Perl 6中最好的方法是什么?而"最好"的意思是:惯用,可读,高效; 不一定按顺序排列.

实际上有两个独立的案例.一个是你必须为不同的$things 做很多检查的地方,另一个是你只做一次或几次的地方.

让我们先来看第一个案例.我想我知道(或者)正确答案.

my $set-of-stuff = set @stuff;
for @whatever -> $thing {
    do-something-with($thing) if $thing ? $set of stuff;
}
Run Code Online (Sandbox Code Playgroud)

实际上你可以跳过第一行并简单地说... if $thing ? @stuff,但是几乎肯定会有更差的性能,因为每次都会创建一个集合.

但现在第二种情况,我只有一个$thing要检查.当然,上面的解决方案是有效的,但创建集合只是为了检查一次,似乎需要很多开销.捷径

do-something-with($thing) if $thing ? @stuff;
Run Code Online (Sandbox Code Playgroud)

这里更有意义,因为我们只称它一次.但是,我们仍然需要为一次使用创建一个集合.

更传统的是:

do-something-with($thing) if @stuff.grep($thing);
Run Code Online (Sandbox Code Playgroud)

或者可能更快:

do-something-with($thing) if @stuff.first($thing);
Run Code Online (Sandbox Code Playgroud)

但这似乎不那么惯用,当然第二个不太可读$thing ? @stuff.

我认为没有智能匹配解决方案,对吧?当然这不起作用:

do-something-with($thing) if $thing ~~ @stuff;
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?

perl6

6
推荐指数
1
解决办法
295
查看次数

如何在Perl 6中高效生成素数列表?

在Perl 6中生成素数列表非常容易:

my @primes = (^?).grep: *.is-prime;
Run Code Online (Sandbox Code Playgroud)

如果你需要相对较少数量的素数,这种方法就足够了,但对于大数字来说效率非常低,因为每个数字都是独立检查的.

有没有办法访问Perl 6的内置主要检查逻辑,以有效地创建素数列表?否则我需要自己建一个筛子.很容易,但我担心高级Perl 6代码中的筛子几乎和我开始使用的代码一样低效.

primes perl6

6
推荐指数
2
解决办法
668
查看次数

Perl 6 Grammar与我认为不应该匹配

我正在做第9天的代码:

你坐了一会儿,记录了一部分流(你的拼图输入).字符代表组 - 以开头{和结尾的序列}.在一个组中,有零个或多个其他东西,用逗号分隔:另一个组或垃圾.由于组可以包含其他组,因此}只关闭最近打开的未关闭组 - 也就是说,它们是可嵌套的.您的拼图输入表示一个单独的大组,其本身包含许多较小的组.

有时候,你会发现垃圾,而不是一个团体.垃圾开始于<和结束>.在这些尖括号之间,几乎可以出现任何字符,包括{}.在垃圾中,<没有特别的意义.

在徒劳地尝试清理垃圾时,一些程序已经取消了其中的一些字符!:内部垃圾,后面的任何字符都!应该被忽略,包括<,>甚至是另一个!.

当然,这对于Perl 6 Grammar来说是尖叫......

grammar Stream
{
    rule TOP { ^ <group> $ }

    rule group { '{' [ <group> || <garbage> ]* % ',' '}' }
    rule garbage { '<' [ <garbchar> | <garbignore> ]* '>' }

    token garbignore { '!' . }
    token …
Run Code Online (Sandbox Code Playgroud)

regex grammar perl6

6
推荐指数
1
解决办法
234
查看次数

Perl 6:maxpairs警告未定义值的字符串化

看起来maxpairs不喜欢在具有未定义值的列表上调用:

> my @foo; @foo[2] = 4; say @foo.maxpairs;
Use of uninitialized value of type Any in string context.
Methods .^name, .perl, .gist, or .say can be used to stringify it to something meaningful.
  in block <unit> at <unknown file> line 1

(2 => 4)
Run Code Online (Sandbox Code Playgroud)

max 没有相同的问题,似乎只是忽略未定义的值:

> my @foo; @foo[2] = 4; say @foo.max;
4
Run Code Online (Sandbox Code Playgroud)

发生同样的错误:

> my @foo; @foo[2] = 4; say @foo.pairs.max(*.value)
Use of uninitialized value of type Any in string context.
Methods .^name, .perl, …
Run Code Online (Sandbox Code Playgroud)

rakudo perl6

6
推荐指数
1
解决办法
104
查看次数

Perl6:.sort()不使用重写的cmp

根据文档,sort比较使用infix:<cmp>.

但:

class Point
{
    has Int $.x;
    has Int $.y;
    method Str { "($!x,$!y)" }
    method gist { self.Str }
}
multi sub infix:<cmp>(Point $a, Point $b) { $a.y cmp $b.y || $a.x cmp $b.x }

my @p = Point.new(:3x, :2y), Point.new(:2x, :4y), Point.new(:1x, :1y);
say @p.sort;
Run Code Online (Sandbox Code Playgroud)

给出输出:

((1,1) (2,4) (3,2))
Run Code Online (Sandbox Code Playgroud)

我用的时候:

say @p.sort(&infix:<cmp>);
Run Code Online (Sandbox Code Playgroud)

确实提供了正确的输出:

((1,1) (3,2) (2,4))
Run Code Online (Sandbox Code Playgroud)

这是文档中的错误,功能还是缺陷?有没有一种方法可以.sort()在一个Points 的列表上使用自定义排序顺序而不指定例程?

perl6

6
推荐指数
1
解决办法
98
查看次数

Raku:捕获标记的效果在“更高”处丢失

以下 Raku 脚本:

#!/usr/bin/env raku
use v6.d;

grammar MyGrammar
{
    rule TOP { <keyword> '=' <value> }
    token keyword { \w+ }
    token value { <strvalue> | <numvalue> }
    token strvalue { '"' <( <-["]>* )> '"' }
    token numvalue { '-'? \d+ [ '.' \d* ]? }
}

say MyGrammar.parse('foo = 42');
say MyGrammar.parse('bar = "Hello, World!"');
Run Code Online (Sandbox Code Playgroud)

有以下输出:

?foo = 42?
 keyword => ?foo?
 value => ?42?
  numvalue => ?42?
?bar = "Hello, World!"?
 keyword => ?bar?
 value => …
Run Code Online (Sandbox Code Playgroud)

regex grammar raku

6
推荐指数
2
解决办法
120
查看次数

如何将复数从命令行传递到子MAIN?

我有以下琐碎的脚本:

#!/usr/bin/env perl6

use v6.c;

sub MAIN($x)
{
    say "$x squared is { $x*$x }";
}
Run Code Online (Sandbox Code Playgroud)

当用实数调用它时,这种方法非常好,但我也希望将它传递给复数.当我按原样尝试时,会发生以下情况:

% ./square i
Cannot convert string to number: base-10 number must begin with valid digits or '.' in '?i' (indicated by ?)
  in sub MAIN at ./square line 7
  in block <unit> at ./square line 5

Actually thrown at:
  in sub MAIN at ./square line 7
  in block <unit> at ./square line 5
Run Code Online (Sandbox Code Playgroud)

当我将脚本更改为

#!/usr/bin/env perl6

use v6.c;

sub MAIN(Complex $x)
{
    say …
Run Code Online (Sandbox Code Playgroud)

perl6

4
推荐指数
2
解决办法
91
查看次数

在Perl中使用Mojo :: DOM的XML模式,如何匹配子标签的内容?

我有以下XML:

<Product>
  ...
    <TitleDetail>
      <TitleType>01</TitleType>
      <TitleElement>
        <TitleElementLevel>01</TitleElementLevel>
        <TitleText>This is the title I'm looking for</TitleText>
      </TitleElement>
    </TitleDetail>
  ...
</Product>
Run Code Online (Sandbox Code Playgroud)

(如果你很好奇,那就是ONIX.)

我想提取01类型的标题.我试过:

say $dom->at('TitleDetail[TitleType="01"] > TitleElement > TitleText')
Run Code Online (Sandbox Code Playgroud)

但这不起作用.看起来tag[attr=value]语法真的只适用于属性.

有一种简单的方法可以做我想要的吗?

xml perl dom mojolicious

4
推荐指数
2
解决办法
107
查看次数

标签 统计

perl6 ×7

regex ×3

grammar ×2

raku ×2

dom ×1

mojolicious ×1

perl ×1

primes ×1

rakudo ×1

xml ×1