这在Perl v5.22中得到了修复。
Perl v5.18 的词法子例程有排序吗?我今天终于对它们使用了,我有一个复杂的排序例程,它依赖于数据结构中的当前位置来查看更深的部分。
这是一个小程序:
use v5.18;
use feature qw(lexical_subs);
no warnings qw(experimental::lexical_subs);
my sub by_numbers { $a <=> $b }
my @sorted = sort by_numbers qw( 4 8 2 3 0 5 7 6 1 9 );
say "sorted: @sorted";
显然 sort 对此一无所知,因为它仍在%main::
中查找命名的子例程:
% perl5.18.2 test.pl
Undefined sort subroutine "main::by_numbers" called at test.pl line 7.
% perl5.20.1 test.pl
Undefined sort subroutine "main::by_numbers" called at test.pl line 7.
我有点失望,因为这是 rjbs 在 perl 5 的词法子例程中使用的第一个用例。
<小时 />这部分无关紧要,因为我查看了当前版本的测试而不是 v5.18 版本。
我在perl源代码中查找t/op/lexsub.t,我发现三个涉及排序的测试。它们在单独运行时会失败,并且在主要方面有所不同:符号表中有一个已定义的同名子例程(正如 rjbs 指出的那样,这些测试来自当前源代码,并且不存在在受影响的稳定版本中)。
use v5.18;
use feature qw(lexical_subs);
no warnings qw(experimental::lexical_subs);
use Test::More;
sub _cmp { $a cmp $b }
sub bar::_cmp { $b cmp $a }
{
package bar;
our sub _cmp;
package main;
is join(" ", sort _cmp split //, 'oursub'), 'u u s r o b', 'sort our_sub'
}
{
state sub _cmp { $b cmp $a }
is join(" ", sort _cmp split //, 'lexsub'), 'x u s l e b',
'sort state_sub LIST'
}
{
my sub _cmp { $b cmp $a }
is join(" ", sort _cmp split //, 'lexsub'), 'x u s l e b',
'sort my_sub LIST'
}
排序在所有情况下都完全忽略词法子例程(对于 Perls v5.18 和 v5.20):
not ok 1 - sort our_sub
# Failed test 'sort our_sub'
# at test.pl line 29.
# got: 'b o r s u u'
# expected: 'u u s r o b'
not ok 2 - sort state_sub LIST
# Failed test 'sort state_sub LIST'
# at test.pl line 35.
# got: 'b e l s u x'
# expected: 'x u s l e b'
not ok 3 - sort my_sub LIST
# Failed test 'sort my_sub LIST'
# at test.pl line 41.
# got: 'b e l s u x'
# expected: 'x u s l e b'
# Tests were run but no plan was declared and done_testing() was not seen.
除了这种测试由于无法隔离环境而存在问题之外,还很难判断测试人员在做什么以及每个测试需要多少先前的远程设置。测试本身的记录很少,如果有的话。
回到重要的事情
我在这里错过了什么吗?这似乎从未奏效。那么诀窍是,测试文件中的什么允许它通过?
请不要建议解决方法。这不是我问的原因。
我想说这在 v5.17.x 中工作然后坏了,但看起来每个人都错过了它,我什至错过了验证它是否有效。 所以。。。其实不然。 或者,更令人高兴的是,它没有。 此问题已在以下位置修复:
commit 2872f91877d2b05fa39d7cd030f43cd2ebc6b046
Author: Father Chrysostomos <sprout@cpan.org>
Date: Tue Sep 16 13:10:38 2014 -0700
Make sort bareword respect lexical subs
—something I completely missed when implementing them.
。自 v5.21.4 以来,这已按预期和承诺工作。