Có hai cân nhắc. Điều hiển nhiên là mảng của bạn sẽ lớn đến cỡ nào? Nếu nó nhỏ hơn vài chục phần tử, thì kích thước không phải là một yếu tố (trừ khi bạn tối ưu hóa vi mô cho một số hàm được gọi nhanh, nhưng bạn phải làm một số thông tin bộ nhớ để chứng minh rằng đầu tiên).
Đó là phần dễ dàng. Việc xem xét thứ hai bị bỏ qua là giao diện. Mảng trả về sẽ được sử dụng như thế nào? Điều này là quan trọng bởi vì toàn bộ mảng dereferencing là kinda khủng khiếp trong Perl. Ví dụ:
for my $info (@{ getInfo($some, $args) }) {
...
}
Thật xấu xí. Thế này tốt hơn.
for my $info (getInfo($some, $args)) {
...
}
Nó cũng tự vay để lập bản đồ và grepping.
my @info = grep { ... } getInfo($some, $args);
Nhưng trả lại một ref mảng có thể hữu ích nếu bạn đang đi để chọn ra các yếu tố cá nhân:
my $address = getInfo($some, $args)->[2];
Đó là đơn giản hơn:
my $address = (getInfo($some, $args))[2];
Hoặc:
my @info = getInfo($some, $args);
my $address = $info[2];
Nhưng tại thời điểm đó, bạn sho câu hỏi uld cho dù @info thực sự là một danh sách hay một băm.
my $address = getInfo($some, $args)->{address};
Điều bạn không nên làm là có getInfo()
trả về tham chiếu mảng trong ngữ cảnh vô hướng và một mảng trong ngữ cảnh danh sách. Điều này làm lộn xộn việc sử dụng truyền thống ngữ cảnh vô hướng như chiều dài mảng sẽ làm người dùng ngạc nhiên.
Cuối cùng, tôi sẽ cắm mô-đun của riêng mình, Method::Signatures, vì nó cung cấp sự thỏa hiệp để chuyển các tham chiếu mảng mà không phải sử dụng cú pháp ref của mảng.
use Method::Signatures;
method foo(\@args) {
print "@args"; # @args is not a copy
push @args, 42; # this alters the caller array
}
my @nums = (1,2,3);
Class->foo(\@nums); # prints 1 2 3
print "@nums"; # prints 1 2 3 42
Điều này được thực hiện thông qua sự kỳ diệu của Data::Alias.
Có thể bạn có thể giải thích ở mức cao hơn những gì bạn đang cố gắng làm. Có thể có một cách hiện đại hơn, Perlish bằng văn bản những gì bạn muốn mà sẽ tránh được vấn đề của bạn hoàn toàn. Hoặc ít nhất làm cho ý định của bạn rõ ràng hơn. –
@unknown (google): Tôi thực hiện việc này thường xuyên trong các ngữ cảnh khác nhau. Lần cuối cùng là khi tôi muốn đọc một tập tin vào một mảng. Vì vậy, các tập tin đã được mở ra, tôi in thông tin về những tập tin tôi đang mở trên STDERR, sửa đổi các dòng một chút và đẩy chúng vào mảng, sau đó đóng tập tin. – Frank
sửa đổi cách thức? giống như nó có thể được thực hiện trên mỗi dòng, với một tuyên bố bản đồ? tôi tìm thấy đẩy một cái gì đó trên một mảng để được đánh giá cao nghi ngờ, một lần nữa ủng hộ các kỹ thuật khác. đôi khi nó không thể được giúp đỡ, mặc dù –