2015-01-13 15 views
9

Điều này được sửa trong Perl v5.22.Loại Perl v5.18 có hiểu các chương trình con từ vựng không?


Các chương trình con từ vựng của Perl v5.18 có sort không? Cuối cùng tôi đã có một sử dụng cho họ ngày hôm nay, nơi tôi đã có một thói quen phân loại phức tạp mà phụ thuộc vào vị trí hiện tại trong cấu trúc dữ liệu để xem xét các phần sâu hơn.

Dưới đây là một chương trình nhỏ:

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"; 

Rõ ràng loại không biết gì về vấn đề này bởi vì nó vẫn đang tìm kiếm trong %main:: cho chương trình con tên là:

% 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. 

tôi hơi thất vọng vì đây là trường hợp sử dụng đầu tiên mà sử dụng rjbs trong lexical subroutines in perl 5.


Phần này không quan trọng vì tôi đã xem phiên bản thử nghiệm hiện tại thay vì phiên bản v5.18.

tôi nhìn nó t/op/lexsub.tin the perl source, tôi thấy ba bài kiểm tra có liên quan đến sort. Chúng thất bại khi chạy trong sự cô lập, và khác nhau theo một cách chính: có một chương trình con được định nghĩa có cùng tên trong bảng biểu tượng (như các ghi chú rjbs, các xét nghiệm này đến từ nguồn hiện tại và không có trong các bản phát hành ổn định bị ảnh hưởng.):

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 hoàn toàn bỏ qua các thủ tục con từ vựng trong mọi trường hợp (ví perls v5.18 và 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. 

Bên cạnh thử nghiệm này là vấn đề vì nó không thành công để cô lập các môi trường, nó cũng khó khăn để nói những gì các thử nghiệm đang làm và bao nhiêu của trước đó, xa thiết lập mỗi nhu cầu kiểm tra. Bản thân các bài kiểm tra được ghi chép nhẹ, nếu có.


trở lại thứ mattering

Am tôi thiếu cái gì ở đây? Có vẻ như điều này không bao giờ hiệu quả. Bí quyết sau đó, là những gì trong tập tin thử nghiệm cho phép nó vượt qua?

Vui lòng không đề xuất cách giải quyết. Đó không phải là lý do tôi hỏi.

Trả lời

13

Tôi muốn nói rằng điều này đã làm việc trong v5.17.x và sau đó bị hỏng, nhưng có vẻ như tất cả mọi người đã bỏ lỡ nó, và tôi bỏ lỡ thậm chí xác minh rằng nó hoạt động. Vì vậy ... nó không. Hoặc, hạnh phúc hơn nhiều, nó thì không. này đã được cố định trong:

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. 

... và kể từ v5.21.4, điều này đã làm việc như mong đợi và hứa.

+0

Ah địa ngục. Tôi biết tôi nên đã thử chảy máu mới nhất nhưng tôi đã lười biếng. Làm thế nào để vượt qua các bài kiểm tra trong perls trước đó mặc dù? –

+0

Xin lỗi, tôi không chắc chắn về những thử nghiệm nào bạn muốn nói. lexsub.t không có kiểm tra phân loại trong v5.20.0, ví dụ: https://github.com/Perl/perl5/blob/v5.20.0/t/op/lexsub.t – rjbs

+0

Ah, tôi đã nhìn vào nguồn hiện tại. Được rồi, điều đó giải thích điều đó. Các bản sửa lỗi này có được trả lại cho các phiên bản Perl được hỗ trợ chính thức hiện tại không? –

Các vấn đề liên quan