Raku vs. Perl5,意想不到的结果

Raku vs. Perl5, an unexpected result

当我在 Raku 中 运行 这个脚本时,我得到带有几个换行符的字母 A。 为什么我 没有 得到预期的连接字符串(和 Perl5 一样)?

EDIT 顺便说一句,我可以使用 Perl5 编译器在 commaIDE 中编译文件吗,我在哪里可以将此编译器更改为 [=14] 的编译器=] ?

say "A";

my $string1  = "00aabb";
my $string2  = "02babe";

say join ("A", $string1, $string2);
print "\n";

my @strings = ($string1, $string2);

say join ("A", @strings);
print "\n";

问题是函数名后面的白色space。如果你在那里留下一个 space ,raku 会将括号中的表达式视为一个单独的列表。这里join会认为你想使用列表作为joiner。

观察:

>raku -e "sub foo( $arg ) { say $arg.WHAT }; foo( 'abc', )"
(Str)

>raku -e "sub foo( $arg ) { say $arg.WHAT }; foo ( 'abc', )"
(List) 

所以简而言之,如果你想用括号来调用子,不要在子名和左括号之间放一个白色space。

参见Traps to avoid, 尝试:

my @s=("00aabb", "02babe");

say join "A", @s;
say join |("A",@s);
say join("A",@s);
say @s.join: "A";

#or some crazy
say join\ ("A",@s);
say "A".&join: @s;
say join @s: "A";
say "A" [&join] @s;
say @s R[&join] "A";
#…

我建议的解决方案是删除括号:

say "A";

my $string1  = "00aabb";
my $string2  = "02babe";

say join "A", $string1, $string2;     # Pass THREE arguments to `join`, not ONE
print "\n";

my @strings = $string1, $string2;

say join "A", @strings;
print "\n";

(第二次调用 join@strings 中的元素被展平,因此与第一次调用 join 的方式相同。)

以上代码显示:

A
00aabbA02babe

00aabbA02babe

When I run this script in Raku I get the letter A with several newlines.

您的代码调用 join 时带有一个参数,即连接器和零个要连接的字符串。因此 join 调用生成空字符串。因此你得到空行。

Why do I not get the concatenated strings

代码中的两个 say join... 语句只打印一个换行符,因为它们就像下面的第三和第四 say 行:

say join(  " \o/ ", "one?", "two?" ); # one? \o/ two?␤

say join   " \o/ ", "one?", "two?"  ; # one? \o/ two?␤

say join ( " \o/ ", "one?", "two?" ); # ␤

say join(  " \o/  one? two?"       ); # ␤

上面的第一行和第二行将三个个字符串传递给join。第三个传递 single List 然后被强制成为 single 字符串( [=23 的元素的串联=] 使用单个 space 字符连接),即与第四行相同的结果。


my @strings = ($string1, $string2); 咒语恰好按照您的预期工作,因为对 = 左侧的“复数”变量的赋值将迭代值或值列表,在右边。

但是在 Raku 中避免冗余代码是一个好习惯,在这种情况下,如果你真的必须使用括号来表达一些不同的东西,那么只使用括号没有它们的代码。这是 Raku 中的一个通用原则,它使代码高信号、低噪音。对于您的代码,所有括号都是多余的。

A: "不要在函数名和左括号 '(' 之间放置空格" ♎️KISS