Perl中的子调用需要括号吗?

时间:2017-08-17 21:33:53

标签: perl

我希望所有这些都打印出1,2和3.但最后两个不要。那是为什么?

#!/usr/bin/perl -w
use strict;

sub mysub {
    return (1,2,3);
}

print "--- foreach (mysub()) prints 1, 2 and 3\n";
foreach (mysub()) {
    print $_, "\n";
}

print "--- foreach (mysub) prints 1, 2 and 3\n";
foreach (mysub) {
    print $_, "\n";
}

print "--- foreach (sort(mysub())) prints 1, 2 and 3\n";
foreach (sort(mysub())) {
    print $_, "\n";
}

print "--- foreach (sort mysub()) prints no elements (huh?)\n";
foreach (sort mysub()) {
    print $_, "\n";
}

print "--- foreach (sort mysub) prints a single 'mysub' string (huh?)\n";
foreach (sort mysub) {
    print $_, "\n";
}

它有这个输出:

--- foreach (mysub()) prints 1, 2 and 3
1
2
3
--- foreach (mysub) prints 1, 2 and 3
1
2
3
--- foreach (sort(mysub())) prints 1, 2 and 3
1
2
3
--- foreach (sort mysub()) prints no elements (huh?)
--- foreach (sort mysub) prints a single 'mysub' string (huh?)
mysub

为什么不在每种情况下分别为1,2和3? (关于debian jessie的Perl 5.18.2)

1 个答案:

答案 0 :(得分:4)

sort的语法是:

  • sort SUBNAME LIST
  • sort BLOCK LIST
  • sort LIST

第一个是非常奇怪的,也是你的问题的根源。

<强> sort mysub()

sort SUBNAME LIST使用名为SUBNAME的子对列表进行排序,因此sort mysub ()要求sort对空列表进行排序。

<强> sort mysub

在这里,Perl再次认为你要sort SUBNAME LIST,直到它找不到LIST。如果提供了不正确的内容,则会猜到它认为是子名称的字符串必须是要排序的项目列表。

这种情况可以更好地处理 - 为什么Perl会假设您想要对单个常量项进行排序? - 但是当您考虑以下内容时,分辨率更有意义:

$ perl -le'my $s = abc; print $s;'
abc

$ perl -le'my ($s) = sort abc; print $s;'
abc

<强>解决方案

  • sort(mysub()) [1]
  • sort +mysub()
  • sort +mysub
  1. parens不能与SUBNAME语法一起使用本身就很奇怪。它们可用于BLOCK语法(例如sort( { $a cmp $b } @a )),并且可用于接受主要标识符的其他函数(例如print(STDOUT "abc\n");)。