2009-02-12 29 views
19

Thường hữu ích khi triển khai các thuật toán bằng cách sử dụng các phép toán mảng lồng nhau. Ví dụ, để tìm ra số từ trong một danh sách bắt đầu với mỗi nhân vật nhất định, bạn có thể làm điều gì đó như thế này trong Python:

>>> a = ["foo","bar","baz"] 
>>> map(lambda c: len(filter(lambda w: w.startswith(c), a)), ('a','b','c','d','e','f')) 
[0, 2, 0, 0, 0, 1] 

Trong biểu w.startswith(c) nó là tầm thường để phân biệt giữa hai biến vòng lặp wc vì chúng có tên khác nhau.

Trong Perl, tôi muốn làm một cái gì đó như thế này:

@a = ("foo", "bar", "baz"); 
map length(grep $_ =~ /^$_/, @a), ('a','b','c','d','e','f') 

Tuy nhiên, vấn đề rõ ràng với điều này là $_ chỉ đề cập đến các trong cùng biến grep lặp (thích hợp cho các $_ trên bên trái), không phải dành cho bên ngoài map (thích hợp cho /^$_/). Cách thành ngữ để tránh vấn đề này trong Perl là gì?

Trả lời

21

Chỉ cần gán cho biến cục bộ:

@a = qw(foo bar baz); 
map {my $ch = $_; scalar grep $_ =~ /^$ch/, @a} qw(a b c d e f) 
+0

Tuyệt vời, mà hiện nó. Cảm ơn cũng cho lời nhắc sử dụng vô hướng thay vì chiều dài! –

+0

tuyệt vời tuyệt vời tuyệt vời – run

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