-t
print reverse "word"; # prints 'word'
我使用的是Perl v5.24。
列表上下文由print reverse foreach ("word"); # prints nothing (empty string)
强制执行,这些语句“不好”
因为print
应该在标量竞赛中调用才有用。
然而,为什么不一致?
答案 0 :(得分:2)
print reverse foreach(" word"); #stack nothing(空字符串)
你所写的是
for ( 'word' ) {
print reverse();
}
该代码在$_
设置为word
时只清楚地执行一次循环,并打印一个反向的空列表
在您更熟悉语言
之前,您可能应该避免使用语句修饰符作为tjd comments,reverse
将反转列表或字符串。在列表上下文中(由对print
的调用强加),它期望反转参数列表,并忽略$_
。在标量上下文中,它只会连接传递给它的所有参数并反转生成的字符串;如果没有任何参数,它将反转$_
答案 1 :(得分:0)
reverse确实可用于标量上下文
perl -wE'$w = "hello"; $r = reverse $w; say $r' # olleh
或列表上下文
perl -wE'say join " ", reverse qw(hello there)' # there hello
两者都很有用,并且在这些行为中没有“不一致”。
需要注意的一点是,在标量上下文中使用列表时
perl -wE'say scalar reverse qw(hello there)' # erehtolleh
然后列表被连接,reverse
返回一个字符串,其字符的顺序相反。
我正在为完整性添加另一个“问题”,即使已经在其他答案中有所涉及。
标量上下文中的reverse
默认为$_
,正如预期的那样。但是,在列表上下文中,它只是不需要$_
,而在for (@ary) { print reverse; }
中,print
强加于它的列表上下文,它没有参数,因此不打印任何内容。
答案 2 :(得分:-1)
在标量上下文中,reverse
会反转字符串的字符。
my $s = "abc";
$s = reverse($s);
say $s;
# cba
在列表上下文中,reverse
会反转其参数列表的标量。
my @a = qw( abc def ghi );
@a = reverse(@a);
say "@a";
# ghi def abc
显然,两种用途都非常一致。标量上下文reverse
和列表 - 上下文reverse
之间唯一可能缺乏一致性的是当您不提供参数表达式时会发生的情况。标量上下文reverse
默认使用$_
,但这样做对列表上下文reverse
没有意义,所以它不会特别处理这种情况。
这意味着print reverse for "word";
没有打印的原因是零项的反向是零项。