Perl 误用“不一致”;反向;在列表上下文中

Perl 误用“不一致”;反向;在列表上下文中,perl,Perl,我使用的是PerlV5.24 列表上下文是由print强制的,这些语句是“坏的” 因为reverse应该在标量竞赛中调用,这样才有用 然而,为什么不一致?确实可以在任何标量上下文中使用 print reverse foreach ("word"); # prints nothing (empty string) 或者在列表上下文中 perl -wE'$w = "hello"; $r = reverse $w; say $r' # olleh 两者都是有用的,在这些行为中没有“不一致性” 需

我使用的是PerlV5.24

列表上下文是由
print
强制的,这些语句是“坏的” 因为
reverse
应该在标量竞赛中调用,这样才有用

然而,为什么不一致?

确实可以在任何标量上下文中使用

print reverse foreach ("word"); # prints nothing (empty string)
或者在列表上下文中

perl -wE'$w = "hello"; $r = reverse $w; say $r'  # olleh
两者都是有用的,在这些行为中没有“不一致性”

需要注意的一点是,当在标量上下文中使用列表时

perl -wE'say join " ", reverse qw(hello there)'  # there hello
然后,该列表被连接起来,
reverse
返回一个字符顺序相反的字符串


为了完整性,我添加了另一个“gotcha”,尽管它已经在其他答案中包含

在标量上下文中,
反向
默认为
$\uu
,如预期的那样。然而,在列表上下文中,它只是不接受
$\uuuu
,而在(@ary){print reverse;}的
中,由于
print
对它施加了列表上下文,它没有参数,因此不打印任何内容

打印每个字的反面不打印任何内容(空字符串)

你写的是

perl -wE'say scalar reverse qw(hello there)'  # erehtolleh
该代码清楚地执行循环一次,将
$\uuu
设置为
word
,并打印一个反向的空列表

也许您应该避免使用语句修饰符,直到您更熟悉该语言为止


正如,
reverse
将反转列表或字符串。在列表上下文中(由调用
print
)它期望参数列表反转,并忽略
$\uuu
。在标量上下文中,它将连接传递给它的所有参数,并反转结果字符串;在没有任何参数的情况下,它将反转标量上下文中的字符串,
反转
反转字符串的字符

for ( 'word' ) {
    print reverse();
}
在列表上下文中,
reverse
反转其参数列表的标量

my $s = "abc";
$s = reverse($s);
say $s;
# cba
显然,这两种用途彼此非常一致。标量上下文
reverse
和列表上下文
reverse
之间唯一可能缺乏一致性的地方是当您不提供参数表达式时会发生什么。标量上下文
reverse
默认情况下使用
$\ucode>,但这样做对列表上下文
reverse
没有意义,因此它不会专门处理这种情况


这意味着原因
打印“word”的反面不打印任何内容是零项的反面是零项。

Re“为什么不一致?”,什么不一致?Re“因为在标量竞赛中应该调用反面才有用”,胡说八道<代码>表示反向qw(abc def ghi)reverse()
将在标量上下文中使用
$\u
,但
print
强制使用列表上下文。请注意,仅在标量上下文中,它默认为$\u@ysth,done。
my $s = "abc";
$s = reverse($s);
say $s;
# cba
my @a = qw( abc def ghi );
@a = reverse(@a);
say "@a";
# ghi def abc