2013-05-07 40 views
7

Chạy perl 5.12.4 Có sự chênh lệch giữa kết quả của hàm khi hàm băm được gán trong câu lệnh trả về hoặc trước đó. Ví dụ dễ nhất là:chuyển nhượng perl để băm trong trở lại chương trình con được lạ

perl -e 'sub s1 { 
    my @a=qw/b 1 c 2 a 3 a 4/; 
    my %[email protected]; 
    return %h 
    } 
    print "@{[ s1()]}\n"' 
c 2 a 4 b 1 


perl -e 'sub s1 { 
    my @a=qw/b 1 c 2 a 3 a 4/; 
    my %[email protected]; 
    return %[email protected] 
    } 
    print "@{[ s1()]}\n"' 
c 2 c 2 a c 

Tại sao (lại) gán cho hàm băm trong câu lệnh trả về (ví dụ thứ 2) làm hỏng hàm băm được trả về?

+2

Xác nhận. Điều này thực sự kỳ lạ. Nhưng khi tôi chạy mã trên v14.2 hoặc v16.3 nó chạy mà không có vấn đề → nó dường như đã được cố định, mặc dù tôi không thể nhìn thấy bất kỳ đề cập đến các bản sửa lỗi liên quan trong perldeltas. – amon

+0

Chạy ví dụ thứ hai của bạn trên perl 5.16.2, tôi nhận được 'b 1 c 2 a 4' – friedo

+0

Điều này hơi lạ. Tôi ** có thể ** sao chép điều này trên một trong các máy của tôi: 'Đây là perl 5, phiên bản 12, subversion 4 (v5.12.4) được xây dựng cho darwin-thread-multi-2level' – chrsblck

Trả lời

2

Vì lỗi. Nó dường như đã được cố định trong 5.14.0. (. Có mặt tại 5.12.4 Không trình bày trong 5.14.0)

Minimal kiểm tra trường hợp:

perl -E"say %h = qw/b 1 c 2 a 3 a 4/" 
+0

Cảm ơn tất cả các bạn đã trả lời. Tôi chấp nhận rằng trang web của tôi cần cập nhật phiên bản Perl của nó lên 5.14. Nó luôn luôn là tốt đẹp để có sanity của một người xác nhận khi các nền tảng phần mềm bắt đầu nhường đường. –

+0

@RobN Bạn có nghĩa là cập nhật ít nhất là 5.14 (5.18 sẽ có sẵn trong một tuần hoặc lâu hơn. Mặc dù nó có thể gây ra các lỗi nhỏ trong codebase của bạn để hiển thị khuôn mặt của chúng en-mass.) –