Questo problema è stato risolto in Perl v5.22.L'ordinamento di Perl v5.18 comprende le subroutine lessicali?
subroutine lessicali
fa Perl V5.18 con sort? Finalmente ho avuto un uso per loro oggi dove ho avuto una complicata routine di ordinamento che dipende dalla posizione corrente nella struttura dei dati per guardare le parti più profonde.
Ecco un piccolo programma:
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";
sa quanto pare sorta nulla su questo, perché è ancora alla ricerca nel %main::
per la subroutine denominata:
% 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.
Sono un po 'deluso, perché questo è il primo caso d'uso utilizzato da rjbs in lexical subroutines in perl 5.
Questa parte non importa, perché ho guardato la versione corrente del test invece della versione V5.18.
ho cercarlo t/op/lexsub.tin the perl source, trovo tre test che coinvolgono sort. Falliscono quando vengono eseguiti separatamente e differiscono in modo sostanziale: c'è una subroutine definita con lo stesso nome nella tabella dei simboli (come le note di rjbs, questi test provengono dalla sorgente corrente e non erano presenti nelle versioni stabili interessate):
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 ignora completamente i sottoprogrammi lessicali in tutti i casi (per Perls V5.18 e 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.
Oltre a questo test essere problematico in quanto non riesce a isolare l'ambiente, è anche È difficile dire cosa sta facendo il tester e quanta parte della precedente e lontana configurazione richiede ogni test. I test stessi sono leggermente documentati, se non del tutto.
torna a roba mattering
mi manca qualcosa qui? Sembra che non abbia mai funzionato. Il trucco quindi, è ciò che nel file di test gli permette di passare?
Si prega di non suggerire soluzioni alternative. Non è per quello che sto chiedendo.
Ah inferno. Sapevo che avrei dovuto provare l'ultimo sanguinamento ma ero pigro. Ma come fa a superare i test nei perls precedenti? –
Siamo spiacenti, non sono sicuro di quali test intendi. lexsub.t non ha avuto test di ordinamento in v5.20.0, ad esempio: https://github.com/Perl/perl5/blob/v5.20.0/t/op/lexsub.t – rjbs
Ah, stavo guardando la fonte attuale. Ok, questo lo spiega. Queste correzioni saranno ripristinate alle attuali versioni supportate ufficialmente di Perl? –