首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Raku和Perl5,一个意想不到的结果

Raku和Perl5,一个意想不到的结果
EN

Stack Overflow用户
提问于 2021-05-31 18:06:10
回答 4查看 485关注 0票数 11

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

编辑 BTW可以用Perl5编译器在commaIDE中编译文件,在哪里可以将该编译器更改为Perl5编译器?

代码语言:javascript
复制
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";
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2021-05-31 20:46:30

我建议的解决办法是放弃父母:

代码语言:javascript
复制
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时,join中的元素是扁平的,因此其作用与对join的第一次调用相同。)

上面的代码显示:

代码语言:javascript
复制
A
00aabbA02babe

00aabbA02babe

当我在Raku中运行这个脚本时,我会得到带有几行换行符的字母A

您的代码使用一个参数(即合并器)调用join,并将零字符串连接起来。因此,join调用生成空字符串。因此你会得到空白行。

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

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

代码语言:javascript
复制
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中,错误地避免冗余代码是一个好习惯,在这种情况下,只有当您必须使用parens来表达与没有它们的代码不同的东西时,才使用parens。这是Raku中的一个通用原理,它可以使代码高信号、低噪音。对于您的代码,所有的父母都是多余的。

票数 11
EN

Stack Overflow用户

发布于 2021-05-31 20:42:06

问题是函数名称后面的空格。如果你在那里留下一个空格,raku会把偏执中的表达式当作一个列表来处理,这是一个单一的东西。在这里,join会认为您想要使用列表作为合并器。

观察:

代码语言:javascript
复制
>raku -e "sub foo( $arg ) { say $arg.WHAT }; foo( 'abc', )"
(Str)

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

所以简单地说,如果你想用偏执来称呼一个子,不要在子名和开头的帕伦之间加一个空格。

票数 11
EN

Stack Overflow用户

发布于 2021-05-31 20:42:53

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

代码语言:javascript
复制
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";
#…
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67778486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档