2011-08-16 28 views
12

Có thể sử dụng một đường dây đơn lẻ foreach trong Perl không?Có thể viết vòng lặp Perl foreach trong một dòng không?

$hash{$thing}++ foreach my $thing (@things); 

Tôi biết điều này là có thể với nhiều lệnh khác như,

die "Invalid file!\n" if (open($Handle, "file.txt")); 

Tôi biết rằng tuyên bố mở có thể bị phá vỡ :)

+0

@Zaid: "inline a loop"? Có lẽ đó chỉ là tôi, nhưng tôi thấy tựa đề trước đó có tính mô tả hơn ...:/ – musiKk

+0

@musiKk: Đã sửa đổi. – Zaid

+0

trên câu lệnh thứ hai của bạn: thay đổi 'if' thành' trừ' hoặc sử dụng thành ngữ phổ biến hơn (và 3arg xử lý mở và từ vựng) 'mở $ handle, '<', 'file.txt' hoặc die 'Lỗi mở tệp: $! ";' Tất nhiên sử dụng ''>'' nếu bạn muốn mở tập tin để viết thay vì đọc. –

Trả lời

29

Hầu. Trong hậu tố foreach, bạn phải sử dụng $ _:

$hash{$_}++ foreach @things; 

Hoặc tương đương (kể từ forforeach được aliased cho cú pháp):

$hash{$_}++ for @things; 
+1

+1 cho ngắn gọn và 'for'. –

+0

Tôi chỉ nhận thấy rằng sau khi tôi đăng, nhưng cảm ơn cho trả lời nhanh chóng. Tôi nhận ra các biến được đặt tên trong một câu lệnh đơn là một chút quá mức cần thiết. –

+0

bạn có thể chỉ, xin vui lòng, nơi cú pháp này được tài liệu? Trang perlsyn không đề cập đến điều này. – user907860

3

Bạn có thể làm:

foreach my $thing (@things) {$hash{$thing}++}; 

nếu bạn muốn nó trên một dòng với một biến lexically-scoped. Bạn không thể đảo ngược số foreach và giữ biến số có phạm vi vòng lặp.

+5

Bạn đã viết "Bạn không thể đảo ngược' foreach' và giữ biến vòng lặp. " Không phải bằng cái tên đó, không, nhưng vậy thì sao? Một 'foreach' một dòng không cần một trình đặt tên có tên. '$ hash {$ _} ++ cho @ things' nói hash ** it ** cho mỗi thứ, hoặc nhiều hơn tiếng Anh, để băm ** các thứ ** của nó. Hãy nhớ rằng '$ _' nên đọc là" nó ". Và "nó" được * đảm bảo * là một biến vòng lặp. Hơn nữa, nó sẽ là một biến riêng tư hoàn toàn mới được viết lexically vào vòng lặp ** IFF ** nếu một từ vựng mở rộng theo tên đó (đọc: '$ _') đã nằm trong phạm vi, và tự động phạm vi khác. Nó vẫn là vòng lặp-scoped một trong hai cách. – tchrist

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