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

时间:2012-01-27 06:59:05

标签: perl

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

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

这里打印

  

'“*** MIDDLE STRING ***”'

首先是排序的@alpha列表。

时为什么以相反的顺序打印
print "a","b";

打印

  

AB

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

我猜它使用“堆叠”数据结构处理“打印”功能的内部工作,但我不知道。有人帮帮我。

提前致谢...

3 个答案:

答案 0 :(得分:7)

' "***MIDDLE STRING***" 'sort的参数,因此它与@alpha的元素一起排序。

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

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

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

将它写成两个单独的陈述更清楚:

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

答案 1 :(得分: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

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

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

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

sort

答案 2 :(得分:1)

我认为确保参数符合预期的最简单的解决方案是使用可选括号来表示相关函数:

print sort(@alpha), '***MIDDLE STRING***';

这适用于很多情况,例如:

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

我认为这样可以很容易地看出哪些参数属于哪里,而不是将整个语句包装在括号中。