我希望嵌套中的代码块只有在整个模式匹配时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
产生很多匹配,所以我希望在整个模式的每次成功匹配期间执行嵌套正则表达式中的代码块.
在文档中,解释了如何在调用之前规范化列表的元素.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) 我经常在工作目录中找到隐藏的子文件夹,正如我想的那样,它是由Perl 6编译器生成的,例如:
.precomp/0717742595706FA8D59800F9F9F7074236546DE7.1505852292.23535/0B/0BDF8C54D33921FEA066491D8D13C96A7CB144B9.repo-id
Run Code Online (Sandbox Code Playgroud)
所以,我有两个问题:
这是正常的吗?
对编译器来说是不可或缺的还是有办法避免它?
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
它是第一对,如果第二对存在则不完全使用)
一个非常简单的问题,但我不能轻易找到答案.
我希望所有人都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) 可以做一个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) 似乎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) 这里发生了什么?
为什么%a{3}
与%a{3}.Array
不同的,如果%a
有Array
值,并且%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) 我正在尝试减少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)
这种差异的原因是什么?
例如,我有一个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)
但这不是我想要的.