为什么print语句的行为方向相反?

jop*_*ine 3 perl

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

@alpha=('toM','jERRy','mickeY','MARio');
print sort{$a cmp $b} @alpha,'  "***MIDDLE STRING***"  ';
Run Code Online (Sandbox Code Playgroud)

在这里它打印

'"***中间弦***"'

首先是排序的@alpha列表.为什么它以相反的顺序打印,何时打印

print "a","b";
Run Code Online (Sandbox Code Playgroud)

版画

AB

按正确的顺序.我google了寻求帮助,但它谈到了perl的"反向"功能/方法,但我没有在我的代码中使用该功能.我发现答案无关紧要.

我想这与"打印"功能的内部工作有关,使用"堆栈"数据结构,但我不知道.有人帮助我.

提前致谢...

Kei*_*son 7

' "***MIDDLE STRING***" '是一个参数sort,所以它与元素一起排序@alpha.

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

print +(sort{$a cmp $b} @alpha), '  "***MIDDLE STRING***"  ';
Run Code Online (Sandbox Code Playgroud)

请注意,如果没有一元+,则括号应用于print调用,字符串文字前面的逗号是逗号运算符,而不是参数之间的分隔符.(是的,这是该语言的一个奇怪特征.)

将它写成两个单独的语句更清楚:

print sort {$a cmp $b} @alpha;
print '  "***MIDDLE STRING***"  ';
Run Code Online (Sandbox Code Playgroud)


Jon*_*rdy 7

print sort {$a cmp $b} @alpha,'  "***MIDDLE STRING***"  ';      #1
print sort {$a cmp $b} (@alpha,'  "***MIDDLE STRING***"  ');    #2

print (sort {$a cmp $b} @alpha), '  "***MIDDLE STRING***"  ';   #3
(print sort {$a cmp $b} @alpha), '  "***MIDDLE STRING***"  ';   #4

print ((sort {$a cmp $b} @alpha), '  "***MIDDLE STRING***"  '); #5

print sort {$a cmp $b} @alpha;                                  #6
print '  "***MIDDLE STRING***"  ';

print sort(@alpha), '  "***MIDDLE STRING***"  ';                #7
print sort({$a cmp $b} @alpha), '  "***MIDDLE STRING***"  ';    #8
Run Code Online (Sandbox Code Playgroud)

#1和#2是等价的:由于Perl自动展平列表,因此在sort包含@alpha加上字符串的所有元素的列表上运行.您可能想要添加一些括号sort(#3),但这也无济于事,因为它被解释为两个元素(#4)的列表:调用的结果print和字符串.因此,字符串不会被打印,因为它与之无关print.

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

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

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

print sort(numerically @array);    # Sort numerically ascending.
print sort(backward @array);       # Sort lexicographically descending.
Run Code Online (Sandbox Code Playgroud)