Đ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.
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ù? –
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
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? –