在这里,Hello $world每个引用符号的解释我的意思是语言.
$world = "W?rl?"
"(Hell)*o $world\n" # <--- plain (Hell)*o, resolve $world, escape \n
'(Hell)*o $world\n' # <--- plain (Hell)*o, plain $world, escape \n
/(Hell)*o $world\n/ # <--- regexp (Hell)*, resolve $world, interpret \n
<(Hell)*o $world\n> # <--- make list ["(Hello*o", "$world\n"]
{(Hell)*o $world\n} # <--- syntax error, this language cant' parse it
Run Code Online (Sandbox Code Playgroud)
Perl 6也足够强大,可以在未来的语言中存在类似的东西
my $emacs_func = (defun perl-backward-to-start-of-continued-exp (lim)
(if (= (preceding-char) ?\))
(forward-sexp -1))
(beginning-of-line)
(if (<= (point) lim)
(goto-char (1+ lim))) …Run Code Online (Sandbox Code Playgroud) 要在perl6中从数组中选择多个元素,这很容易:只需使用索引列表即可:
> my @a = < a b c d e f g >;
> @a[ 1,3,5 ]
(b d f)
Run Code Online (Sandbox Code Playgroud)
但是要取消选择这些元素,我必须使用Set:
> say @a[ (@a.keys.Set (-) (1,3,5)).keys.sort ]
(a c e g)
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更简单的方法,因为我使用的数组通常很大?
我有两个元素的列表的列表,就像你用得到的,例如(1..5) Z (20..24),我要制作成一个哈希(在这个例子中,你通过得到什么{1 => 20, 2 => 21, 3 => 22, 4 => 23, 5 =>24}。我能做到“手”,但ISN不太优雅,我相信 Raku 有一种惯用的方法。我想出的不优雅的替代方案是:
my @a = (1..5) Z (20..24);
my %a;
for @a -> @x {
%a{@x[0]} = @x[1];
Run Code Online (Sandbox Code Playgroud) 在启示录中,有一些关于布尔断言的词:
<( code )> # call code as boolean assertion
Run Code Online (Sandbox Code Playgroud)
但是,我无法让它发挥作用。
say "9471" ~~ m:g/ (\d) <($0 > 5)> /
Run Code Online (Sandbox Code Playgroud)
我希望只匹配大于 5 的数字,但出现编译错误。
哪个是正确的语法(如果存在),或者做一些布尔断言的任何替代方法?
我们如何知道并确定循环的当前点是否是最后一个(因为在 Perl 中由于有 \ ref. 运算符可见而简单地完成了这一点)?
编辑后的更正链接: https://perlmonks.org/? node_id=11140741
请帮忙指出解决方法。谢谢
此代码按预期工作:
\nsub infix:<mean>(*@a) {\n @a.sum / @a.elems\n}\nsub Mean (*@a) {\n @a.sum / @a.elems\n}\n\nsay EVAL 'Mean 2, 6, 4'; # Output: 4\nsay EVAL '2 mean 6 mean 4'; # Output: 4\nRun Code Online (Sandbox Code Playgroud)\n当第 7 行在其自己的范围内时,它会按预期工作:
\n{say EVAL 'Mean 2, 6, 4';} # Output: 4\nRun Code Online (Sandbox Code Playgroud)\n但是当第 8 行在它自己的作用域内时:
\n{say EVAL '2 mean 6 mean 4';} \n\n===SORRY!=== Error while compiling .../EVAL_1\nTwo terms in a row\nat .../EVAL_1:1\n------> 2\xe2\x8f\x8f mean 6 mean 4\n expecting any of:\n infix\n infix stopper\n statement end\n …Run Code Online (Sandbox Code Playgroud) 如果您知道其索引,则可以使用Perl 6中的副词:delete删除数组元素:
my @letters = <a b c>; @letters[0]:delete; say @letters
# OUTPUT: «[(Any) b c]?»
Run Code Online (Sandbox Code Playgroud)
但是,如果您不知道索引,则无法执行此操作:
my @letters = <a b c>; $_:delete if $elem eq 'a' for @letters
#ERROR! ? Variable '$_:delete' is not declared
Run Code Online (Sandbox Code Playgroud)
如果声明循环变量is rw仍然是同一个问题:
my @letters = <a b c>; for @letters -> $l is rw { $l:delete if $l eq 'a' }; say @letters
#ERROR! ? Variable '$l:delete' is not declared
Run Code Online (Sandbox Code Playgroud)
似乎没有其他方法可以删除数组元素.该等效Perl 5的delete点,实际上,该副词.你可以使用,splice但你必须再次知道索引.实现似乎是这个函数, …
我试图从使用常规代码的用户输入中获取列表,但是由于以下错误,有时它会意外失败:
This type cannot unbox to a native integer: P6opaque, Str
Run Code Online (Sandbox Code Playgroud)
代码行是
my @a = prompt("Enter list: ").words || (1,2,3);
Run Code Online (Sandbox Code Playgroud)
仅当我仅输入一个数字时,它才会失败。
什么时候在没有用户意识的情况下将Str转换为“ P6opaque,Str”?我不能使用+ @ a [0]或@a [0] .Int将此“ P6opaque,Str”转换为Int。我在这里想念什么?
非常感谢您的帮助 !!!
赖脯
这似乎是一个简单的问题,但 Perl6/Raku 的行为并不像我预期的那样。我正在尝试在散列中创建对数组的引用,但没有得到预期的行为。在 Perl5 中,答案将涉及通过引用访问数组,但我没有看到 Perl6/Raku 的等效语法。
my $jsonstr = q:to/END/;
{
"arr" : [
"alpha","beta","delta","gamma"
]
}
END
my %json = from-json $jsonstr;
my @arr = %json{'arr'};
say "Arr length is " ~ @arr.elems; # Expect 4, get 1
say "Orig length is " ~ %json{'arr'}.elems; # Get expected value of 4
say "Arr[0] is " ~@arr[0].^name ~ " of length " ~ @arr[0].elems; # First index is array
say %json{'arr'}[0]; # Indexing into array in original location works …Run Code Online (Sandbox Code Playgroud) my sub e($r) { printf("%d, ", $_) for 1..$r}
say e(5);
Run Code Online (Sandbox Code Playgroud)
返回1, 2, 3, 4, 5, Nil,即sub和/或say始终在末尾添加Nil。
我第一次尝试使用 rakudo 版本 2020.02。我现在尝试使用最新版本 2020.12.1 并且Nil仍然存在。如何摆脱它?