我希望所有这些都打印出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)
答案 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
SUBNAME
语法一起使用本身就很奇怪。它们可用于BLOCK
语法(例如sort( { $a cmp $b } @a )
),并且可用于接受主要标识符的其他函数(例如print(STDOUT "abc\n");
)。