Perl v5.18 的排序是否理解词法子例程?

Does Perl v5.18's sort understand lexical subroutines?

这已在 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.

我有点失望,因为这是 rjbs uses in lexical subroutines in perl 5 的第一个用例。


这部分无所谓因为我看的是当前测试的版本而不是v5.18版本

我看了一下t/op/lexsub.t 在perl源码,我发现三个测试涉及sort.它们在孤立地 运行 时失败,并且在主要方面有所不同:在符号 table 中有一个定义的同名子例程(如 rjbs 所指出的,这些测试来自当前源并且不存在在受影响的 stable 版本中。):

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 <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 以来,这已按预期和承诺的方式工作。