问题描述
当我在 Raku
中运行此脚本时,我收到带有多个换行符的字母 A
。
为什么我没有按预期获得连接的字符串(和 Perl5 一样)?
EDIT 顺便说一句,我可以使用 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";
解决方法
问题是函数名后面的空格。如果你在那里留一个空格,raku 会将括号中的表达式视为一个 List,它是一个单一的事物。这里 join 会认为你想使用列表作为加入者。
观察:
>raku -e "sub foo( $arg ) { say $arg.WHAT }; foo( 'abc',)"
(Str)
>raku -e "sub foo( $arg ) { say $arg.WHAT }; foo ( 'abc',)"
(List)
简而言之,如果您想使用括号来调用子程序,请不要在子程序名称和开头括号之间放置空格。
,我建议的解决方案是去掉括号:
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
并使用一个参数(即连接器)和零个字符串进行连接。因此 join
调用生成空字符串。因此你会得到空行。
为什么我没有得到连接的字符串
代码中的两个 say join...
语句只打印一个换行符,因为它们类似于下面的第三和第四行 say
:
say join( " \o/ ","one?","two?" ); # one? \o/ two?
say join " \o/ ","two?" ; # one? \o/ two?
say join ( " \o/ ","two?" ); # 
say join( " \o/ one? two?" ); # 
上面的第一行和第二行将 三个 字符串传递给 join
。第三个传递一个 single List
然后被强制成为一个 single 字符串(使用单个元素连接的 List
元素的串联空格字符),即与第四行结果相同。
my @strings = ($string1,$string2);
咒语恰好按您的预期工作,因为对 =
左侧的“复数”变量赋值将迭代右手边。
但是在 Raku 中避免冗余代码是一个好习惯,在这种情况下,只有在您确实必须使用括号来表达与没有它们的代码不同的东西时才使用括号。这是 Raku 中使代码高信号、低噪声的一般原则。对于您的代码,所有括号都是多余的。
,见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";
#…
,
A: "不要在函数名和开头括号之间放置空格'('" ♎️KISS