这在Perl v5.22中已修复。

Perl v5.18的词法子例程是否带有sort?今天,我终于对它们有用了,在那里我有一个复杂的排序例程,该例程取决于数据结构中的当前位置以查看更深的部分。

这是一个小程序:

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.

我有点失望,因为这是rjbslexical subroutines in perl 5中使用的第一个用例。

这部分无关紧要,因为我查看了测试的当前版本,而不是v5.18版本。

我看它是t/op/lexsub.t in the perl source,发现了三个涉及sort的测试。它们在隔离运行时会失败,并且在主要方面有所不同:符号表中有一个已定义名称相同的子例程(正如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'
}

sort在所有情况下(对于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 <[email protected]>
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起,此功能已达到预期和 promise 。

10-06 12:50