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
当我在 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 letterA
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