【问题标题】:why print statement behaves in reverse order?为什么 print 语句的行为顺序相反?
【发布时间】:2012-01-27 06:59:05
【问题描述】:

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

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

在这里打印

' "***中间字符串***" '

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

print "a","b";

打印

ab

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

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

提前谢谢...

【问题讨论】:

    标签: perl


    【解决方案1】:
    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):调用 print 的结果和细绳。因此字符串不会被打印,因为它与print无关。

    您可以使用一组额外的括号 (#5) 或将其拆分 (#6),但知道 sort {$a cmp $b} @alphasort @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.
    

    【讨论】:

    • 为什么不print sort(@alpha), '***MIDDLE STRING***'
    • @TLP:我只是在给出理由之前避免删除 block 参数。并且print sort(@a), "s" 很好,但是print sort{$a cmp $b}(@a), "s" 与问题相同。但我会编辑以添加该示例。
    • 其实应该是print sort({$a cmp $b} @a), "s"。没问题。
    【解决方案2】:

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

    如果您想打印@alpha 的排序内容后跟该字符串,您可以这样做:

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

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

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

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

    【讨论】:

      【解决方案3】:

      我认为确保参数到达预期位置的最简单解决方案是对相关函数使用可选括号:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-25
        • 2021-04-30
        • 2019-12-06
        相关资源
        最近更新 更多