Perl 为什么print语句的行为顺序相反?

Perl 为什么print语句的行为顺序相反?,perl,Perl,在我的perl程序中,我有以下代码: @alpha=('toM','jERRy','mickeY','MARio'); print sort{$a cmp $b} @alpha,' "***MIDDLE STRING***" '; 在这里,它打印了 “***中间字符串***” 首先是排序后的@alpha列表。为什么按相反的顺序打印 print "a","b"; 印刷品 ab 按正确的顺序。我在谷歌上搜索帮助,但它提到了perl的“反向”函数/方法,但我在代码中没有使用该函数。我发现答案无

在我的perl程序中,我有以下代码:

@alpha=('toM','jERRy','mickeY','MARio');
print sort{$a cmp $b} @alpha,'  "***MIDDLE STRING***"  ';
在这里,它打印了

“***中间字符串***”

首先是排序后的@alpha列表。为什么按相反的顺序打印

print "a","b";
印刷品

ab

按正确的顺序。我在谷歌上搜索帮助,但它提到了perl的“反向”函数/方法,但我在代码中没有使用该函数。我发现答案无关紧要

我猜它涉及“打印”函数的内部工作,使用“堆栈”数据结构,但我不知道。谁来帮帮我

提前感谢…

“***中间字符串***”
是排序的参数,因此它与
@alpha
的元素一起排序

如果要打印
@alpha
的排序内容,然后再打印该字符串,可以执行以下操作:

print +(sort{$a cmp $b} @alpha), '  "***MIDDLE STRING***"  ';
请注意,如果没有一元
+
,括号将应用于
打印
调用,字符串文本前面的逗号是逗号运算符,而不是参数之间的分隔符。(是的,这是该语言的一个奇怪特征。)

将其写成两个单独的语句更为清晰:

print sort {$a cmp $b} @alpha;
print '  "***MIDDLE STRING***"  ';
#1和#2是等效的:
sort
在一个包含
@alpha
所有元素和字符串的列表上运行,这要归功于Perl的列表自动展平功能。您可能想在
sort
(#3)周围添加一些括号,但这也没有帮助,因为它被解释为两个元素的列表(#4):调用
print
的结果和字符串。因此,字符串将不会被打印,因为它与
print
无关

您可以使用一组额外的括号(#5)或将其拆分(#6),但是知道
sort{$a cmp$b}@alpha
sort@alpha
相同,您可以省略该块,括号变得简单(#7)。根据同样的规则,如果您确实需要一个比较函数,您可以将这两个参数放在括号内,而不是用逗号(#8)分隔

我还喜欢为不同类型的排序定义sub,以使代码更易于阅读:

sub numerically { $a <=> $b }
sub backward { $b cmp $a }

print sort(numerically @array);    # Sort numerically ascending.
print sort(backward @array);       # Sort lexicographically descending.
次数字{$a$b}
次向后{$b cmp$a}
打印排序(数字@数组);#按数字升序排序。
打印排序(向后@数组);#按字典顺序降序排序。

我认为确保参数指向其应该指向的地方的最简单的解决方案是对所讨论的函数使用可选括号:

print sort(@alpha), '***MIDDLE STRING***';
这适用于许多情况,例如:

print join(':', @array), "\n";
@array = map(uc, @foo), @bar;

我认为这样可以很容易地看出哪些参数属于何处,而不是将整个语句都用括号括起来。

为什么不
打印排序(@alpha),“***中间字符串***”
?@TLP:我只是在给出原因之前不删除块参数。而
print sort(@a),“s”
可以,但是
print sort{$a cmp$b}(@a),“s”
的问题与问题相同。但我将编辑添加该示例。实际上,这是
打印排序({$a cmp$b}@a),“s”
。没问题。
print join(':', @array), "\n";
@array = map(uc, @foo), @bar;