在列表上下文中滥用“反向”的不一致性

时间:2017-05-15 17:40:52

标签: perl

-t
print reverse "word"; # prints 'word'

我使用的是Perl v5.24。

列表上下文由print reverse foreach ("word"); # prints nothing (empty string) 强制执行,这些语句“不好”  因为print应该在标量竞赛中调用才有用。

然而,为什么不一致?

3 个答案:

答案 0 :(得分:2)

  

print reverse foreach(" word"); #stack nothing(空字符串)

你所写的是

for ( 'word' ) {
    print reverse();
}

该代码在$_设置为word时只清楚地执行一次循环,并打印一个反向的空列表

在您更熟悉语言

之前,您可能应该避免使用语句修饰符

作为tjd commentsreverse将反转列表或字符串。在列表上下文中(由对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";没有打印的原因是零项的反向是零项。