2015-01-13 14 views
9

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.

risposta

13

Mi piacerebbe dire che questo funzionava nella v5.17.x e poi si è rotto, ma sembra che tutti lo abbiano mancato, e mi sono perso anche verificando che funzionasse. Quindi ... non è così. O, molto più felicemente, no no. Questo è stato fissato in:

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. 

... e dato v5.21.4, questo ha funzionato come previsto e promesso.

+0

Ah inferno. Sapevo che avrei dovuto provare l'ultimo sanguinamento ma ero pigro. Ma come fa a superare i test nei perls precedenti? –

+0

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

+0

Ah, stavo guardando la fonte attuale. Ok, questo lo spiega. Queste correzioni saranno ripristinate alle attuali versioni supportate ufficialmente di Perl? –