2011-02-12 23 views
5

Tôi đã đọc một số tệp delta perl513 * và tôi đã thấy một số tính năng mới sắp có trong Perl 5.14. Bắt đầu với Perl 5.13.7 nhiều chức năng mảng/băm sẽ hoạt động on array/hash refs as well. Trong khi điều này có thể được nhìn thấy chủ yếu là đường cú pháp, hoặc Perl làm những gì bạn mong đợi, tôi tự hỏi, sẽ/nên điều này thay đổi mô hình khai báo cấu trúc dữ liệu trong Perl? Với thông báo trước rằng nó phá vỡ khả năng tương thích với tai nghe Perl, những gì sẽ là tranh luận và chống lại bằng cách sử dụng cấu trúc vô danh chủ yếu?Sử dụng tham chiếu cấu trúc dữ liệu phổ biến hơn

Ví dụ:

#!/usr/bin/env perl 

use strict; 
use warnings; 

use 5.13.7; 

my $hashref = { 
    english => 'hello', 
    spanish => 'hola', 
    french => 'bon jour' 
}; 

foreach my $greeting (keys $hashref) { 
    say $hashref->{$greeting}; #use say since we need a later version anyway 
} 

chứ không phải theo cách truyền thống hơn sử dụng một băm tên (%hash).

P.S. Nếu điều này được nhìn thấy là tăng thêm tôi có thể thay đổi để CW, nhưng tôi tò mò muốn nghe một số quan điểm.

+1

Điều này sẽ có lợi ích bổ sung mà bạn sẽ không phải sử dụng biến cố định thường xuyên. Bạn chỉ có thể sử dụng các lớp với quá tải. –

+0

Thú vị. Có, sử dụng tính năng này sẽ ngăn mã của bạn chạy trên các phiên bản Perl cũ hơn. Do cơ sở cài đặt khổng lồ của các phiên bản Perl cũ hơn, tôi sẽ tránh nó trừ khi bạn biết bạn sẽ có quyền kiểm soát phiên bản Perl bạn sẽ chạy. (Nó chỉ là cú pháp sau khi tất cả.) –

Trả lời

4

Khả năng sử dụng các hàm mảng và hàm băm nhất định trên tham chiếu chỉ là cú pháp và không ảnh hưởng đến cách bạn làm việc với cấu trúc số nhiều cấp đầu tiên. Có nhiều lý do cho việc này:

cho my $array = [1 .. 10]

  • chức năng Danh sách xử lý như map, grep, sort, reverse, print, say, printf và nhiều người khác vẫn cần phải được thông qua danh sách thích hợp, vì vậy đây có nghĩa là sử dụng @$array so với đơn giản hơn @array với các chức năng này.

  • Vòng lặp for/foreach cần phải được thông qua một danh sách, đòi hỏi @$array

  • $array phải lúc nào cũng đúng, để xác định độ dài bạn cần phải viết @$array

    while ($array) { infinite loop } 
    while (@$array) { what you probably wanted } 
    while (@array) { no room for error here } 
    
  • tiểu kịch bản một thực @array như $array[$idx] là nhanh hơn nhanh (~ 15%) so với $array->[$idx] vì không cần thiết phải thực hiện điều này khi truy cập. Sự khác biệt với băm nhỏ hơn, khoảng 3%, do chi phí của hàm băm.

Về cơ bản, bằng cách di chuyển đến tất cả các tham chiếu, bạn sẽ nhận được một bộ chức năng khác cần sử dụng bảng điều khiển dereferencing. Thay vào đó, hãy tận dụng chức năng trước v5.13.7 cho bất kỳ thứ gì bạn khai báo để sử dụng ngay my @array; my %hash; và sử dụng các phím tắt cú pháp mới ở những khu vực mà bạn đã sử dụng quá nhiều cấu trúc @{ ... } hoặc %{ ... }.

+0

Đây là những gì tôi đang tìm kiếm, so sánh tốc độ, vv Plus tôi đã quên về bối cảnh vô hướng trên một mảng để có được kích thước của nó. Tôi đã chú ý đến/foreach trong khi chuẩn bị ví dụ của tôi. Vâng, cảm ơn, tôi đã chỉ là những thứ overthinking như bình thường. –

1

Tôi không tin rằng thay đổi sắp tới này sẽ phá vỡ tính tương thích ngược. Bây giờ bạn gặp lỗi trên keys $hashref, với perl 5.14 nó sẽ hoạt động. Vì vậy, hiệu quả không có mã hiện tại có thể được sử dụng tính năng như vậy.

+0

không lạc hậu tương hợp theo nghĩa đó. Tôi có nghĩa là nếu tôi viết mã theo cách tôi đã đề cập, nó sẽ không hoạt động trên các phiên bản cũ hơn. Bạn sẽ cần 'sử dụng 5.14' (là cú pháp đúng?) –

+3

' sử dụng 5.14.0' hoặc 'sử dụng 5.014000' –

+0

chỉnh sửa mã của tôi để phản ánh nhận xét này –

1

Đường cú pháp tốt là quan trọng. Perl chính nó là "chỉ" cú pháp đường trên C mà đường lắp ráp mà đường máy mã.

Điều này sẽ không thay đổi cách sử dụng cấp cao nhất trong ví dụ của bạn, nhưng sẽ giúp giảm cú pháp khó xử khi sử dụng cấu trúc phức tạp, tức là "push @ ($ this -> {somekey}), $ stuff" đẩy $ this -> {somekey}, $ stuff ".

+0

đã đồng ý, xem nhận xét của tôi với Eric, Cảm ơn –

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