11

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

编辑顺便说一句,我可以用编译器在commaIDE文件中Perl5编译,我在哪里可以把这个编译器改成Perl5?

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";
4

4 回答 4

11

问题是函数名后面的空格。如果您在此处留出空格,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) 

所以简而言之,如果你想使用括号来调用子,不要在子名称和开始括号之间放置空格。

于 2021-05-31T20:42:06.550 回答
11

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

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";

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

上面的代码显示:

A
00aabbA02babe

00aabbA02babe

当我在其中运行此脚本时,Raku我收到A带有几个换行符的字母。

您的代码join使用 ONE 参数(即连接符)和要连接的零字符串调用。所以join调用会生成空字符串。因此你得到空行。

为什么我没有得到连接的字符串

代码中的两个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. 第三行传递一个单一 List的,然后被强制成为一个单一的字符串(List使用单个空格字符连接的元素的串联),即与第四行相同的结果。


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

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

于 2021-05-31T20:46:30.017 回答
9

请参阅要避免的陷阱,尝试:

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";
#…
于 2021-05-31T20:42:53.363 回答
3

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

于 2021-06-08T21:20:35.863 回答