小编Eug*_*sky的帖子

仅当Perl 6中的整个匹配成功时,才在嵌套的正则表达式中执行代码块

我希望嵌套中的代码块只有在整个模式匹配时regex才能执行.

这是我的测试代码.

my regex left {
    | a  { take "left: 'a' matched" }
    | aa { take "left: 'aa' matched" }
}
my regex right { b }
my regex whole {
    ^
    <left>
    <right>
    $
}

my $string = 'aab';
my @left_history = gather
      $string ~~ m:ex/ <whole> /;

.say for @left_history;
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,它产生以下输出:

left: 'aa' matched
left: 'a' matched
Run Code Online (Sandbox Code Playgroud)

但我希望它只打印第一行,对应left于成功匹配中使用的值.可能吗?

(当然,据我所知,我可以<left>$/匹配变量中提取成功的值)

UPD:通常,:ex或者:g产生很多匹配,所以我希望在整个模式的每次成功匹配期间执行嵌套正则表达式中的代码块.

regex perl6

5
推荐指数
1
解决办法
156
查看次数

在 Perl 6 中使用带有数字的 .unique(:as ...)

文档中,解释了如何在调用之前规范化列表的元素.unique

可选的 :as 参数允许您在唯一化之前规范化/规范化元素。这些值被转换以进行比较,但它仍然是原始值进入结果列表。

并给出了以下示例:

say <a A B b c b C>.unique(:as(&lc))          # OUTPUT: «(a B c)?»
Run Code Online (Sandbox Code Playgroud)

如果我想让有理数列表唯一,只比较它们的整数部分怎么办?我应该如何Int在括号内调用方法:as

my @a = <1.1 1.7 4.2 3.1 4.7 3.2>;
say @a.unique(:as(?????))                # OUTPUT: «(1.1 4.2 3.1)?»
Run Code Online (Sandbox Code Playgroud)

UPD: 根据@Håkon 的回答,我找到了以下解决方案:

> say @a.unique(:as({$^a.Int}));
(1.1 4.2 3.1)
Run Code Online (Sandbox Code Playgroud)

或者

> say @a.unique(as => {$^a.Int});
(1.1 4.2 3.1)
Run Code Online (Sandbox Code Playgroud)

没有它可以做到$^a吗?

UPD2: 是的,它来了!

> say @a.unique(as => *.Int);
(1.1 4.2 3.1)
Run Code Online (Sandbox Code Playgroud)

或者

> say (3, …
Run Code Online (Sandbox Code Playgroud)

raku

5
推荐指数
1
解决办法
68
查看次数

.precomp ...在Perl 6的工作文件夹中的repo-id子文件夹

我经常在工作目录中找到隐藏的子文件夹,正如我想的那样,它是由Perl 6编译器生成的,例如:

.precomp/0717742595706FA8D59800F9F9F7074236546DE7.1505852292.23535/0B/0BDF8C54D33921FEA066491D8D13C96A7CB144B9.repo-id
Run Code Online (Sandbox Code Playgroud)

所以,我有两个问题:

  1. 这是正常的吗?

  2. 对编译器来说是不可或缺的还是有办法避免它?

perl6

5
推荐指数
1
解决办法
101
查看次数

在Perl 6中,密钥长于一个符号的.trans

trans是一个非常有用和强大的工具,但它对我来说仍然有点神秘.

例如,我仍然不理解文档中的这句话:

如果使用键和值列表,也可以替换子串.

如果键和值长于一个符号,算法是什么?

以下测试代码探讨了如何.trans使用"冲突"键.为什么第一对的工作方式会有所不同,具体取决于它是单独的还是伴随第二对?

my Pair @trans =
     ab => '12',
     bc => '34',
     ;
my $str = 'ab';
say "both trans: $str.trans(@trans)";    # 13
say "1st  trans: $str.trans(@trans[0])"; # 12
Run Code Online (Sandbox Code Playgroud)

使用哈希而不是对列表会产生不同的结果:

my %trans =
     ab => '12',
     bc => '34',
     ;
my $str = 'ab';
say "both trans: $str.trans(%trans)";    # 12
Run Code Online (Sandbox Code Playgroud)

(据我所知hash,成对可以按任何顺序进行,但在第一个例子中,list它是第一对,如果第二对存在则不完全使用)

perl6

5
推荐指数
1
解决办法
163
查看次数

如果我在Perl 6中重新分配OUT,我怎么能把它改回到stdout?

一个非常简单的问题,但我不能轻易找到答案.

我希望所有人都say在一个块中去一个文件.但后来我希望我的输出返回STDOUT.怎么做?

my $fh_foo = open "foo.txt", :w;
$*OUT = $fh_foo;
say "Hello, foo! Printing to foo.txt";

$*OUT = ????;
say "This should be printed on the screen";
Run Code Online (Sandbox Code Playgroud)

perl6

5
推荐指数
1
解决办法
141
查看次数

如何在Perl 6中取消/减去正则表达式(不仅是字符类)?

可以做一个join,使字符串匹配两个或多个regex模式。

> "banana" ~~ m:g/ . a && b . /
(?ba?)
Run Code Online (Sandbox Code Playgroud)

另外,可以否定一个字符类别:如果我只想匹配辅音,我可以采用所有字母并减去元音的字符类别:

> "camelia" ~~ m:g/ <.alpha> && <-[aeiou]> /
(?c? ?m? ?l?)
Run Code Online (Sandbox Code Playgroud)

但是,如果我需要否定/减去某个字符regex长度,而不是一个字符类别,该怎么办?像这样:

> "banana" ~~ m:g/ . **3 && NOT ban / # doesn't work
(?ana?)
Run Code Online (Sandbox Code Playgroud)

perl6

5
推荐指数
2
解决办法
213
查看次数

在Perl 6中,.is-prime和is-prime()之间是否有一些区别?

似乎is-prime.is-prime以不同方式对待他们的论点:

> is-prime('11')
True
> '11'.is-prime
No such method 'is-prime' for invocant of type 'Str'
  in block <unit> at <unknown file> line 1
> is-prime(2.5)
False
> (2.5).is-prime
No such method 'is-prime' for invocant of type 'Rat'
  in block <unit> at <unknown file> line 1
Run Code Online (Sandbox Code Playgroud)

perl6

5
推荐指数
1
解决办法
170
查看次数

在Perl 6中使用Array值进行哈希处理

这里发生了什么?

为什么%a{3}%a{3}.Array不同的,如果%aArray值,并且%a{3}Array

> my Array %a
{}
> %a{3}.push("foo")
[foo]
> %a{3}.push("bar")
[foo bar]
> %a{3}.push("baz")
[foo bar baz]
> .say for %a{3}
[foo bar baz]
> %a{3}.WHAT
(Array)
> .say for %a{3}.Array
foo
bar
baz
Run Code Online (Sandbox Code Playgroud)

perl6

5
推荐指数
2
解决办法
199
查看次数

减少Perl 6中的逻辑运算符

我正在尝试减少and并得到一个奇怪的输出:

> [and] 2>1, 3>2, put 1, put 2
2
1True
Run Code Online (Sandbox Code Playgroud)

同时如果我and在每个表达式之间放置,一切都还可以.

> 2>1 and 3>2 and put 1 and put 2
1
2
Run Code Online (Sandbox Code Playgroud)

这种差异的原因是什么?

perl6

5
推荐指数
1
解决办法
102
查看次数

如何在功能上使用Perl 6中列表的所有元素?

例如,我有一个Array数字:

> my @a = ^5
[0 1 2 3 4]
Run Code Online (Sandbox Code Playgroud)

我想打印他们的方块.我可以使用map,但它也会返回一个修改过的List(这五个True),我不想要:

> @a.map({ put $_**2 })
0
1
4
9
16
(True True True True True)
Run Code Online (Sandbox Code Playgroud)

我找到的唯一方法是使用hyper >>:

> @a>>.&{ put $_**2 }
0
1
4
9
16
Run Code Online (Sandbox Code Playgroud)

  • 语法有点笨拙(可能我不这么做)
  • 如果我不想让它合作hyper怎么办?

那么正确的方法是什么?

PS当然,我可以使用map然后put结果:

.put for @a.map: {$_**2 }
Run Code Online (Sandbox Code Playgroud)

但这不是我想要的.

perl6

5
推荐指数
3
解决办法
136
查看次数

标签 统计

perl6 ×9

raku ×1

regex ×1