2010-02-17 64 views
24

Tôi thấy chúng được sử dụng thay thế cho nhau. Có gì khác biệt?Sự khác nhau giữa 'for' và 'foreach' trong Perl là gì?

+0

+1: chào mừng bạn đến stackoverflow :) – Sarfraz

+4

Chúng từng là ý tưởng riêng biệt, nhưng bây giờ chúng là từ đồng nghĩa. Perl tìm ra những gì cần làm dựa trên những gì trong() thay vì sử dụng từ khóa. Đổ lỗi cho những người không thể gõ thêm bốn ký tự. :) –

Trả lời

32

Không có sự khác biệt. Từ perldoc perlsyn:

Từ khóa foreach thực sự là một từ đồng nghĩa với các từ khóa for, vì vậy bạn có thể sử dụng foreach để có thể đọc hoặc for cho ngắn gọn.

12

Tôi thấy chúng được sử dụng thay thế cho nhau.

Không có sự khác biệt nào khác với cú pháp.

+1

+1 Có, Perl khá giàu đường cú pháp. Có nhiều hơn thì một cách để nói nó. – Thilo

+0

@Thilo: đã đồng ý :) – Sarfraz

+0

@Sinan Ünür: Cảm ơn :) – Sarfraz

5

Bốn chữ cái.

Chúng là chức năng giống hệt nhau, chỉ được viết khác nhau.

+0

Thực ra việc biên dịch xuống cùng một mã opcodes. Vì vậy, đối với tất cả ý định và mục đích, chúng giống hệt nhau. –

3

Kể từ ngày introduction in perl-2.0, foreach của chúng tôi đồng nghĩa với for. Đó là một cái gật đầu với lệnh foreach của trình bao C.

Trong mã của riêng tôi, trong trường hợp hiếm hoi mà tôi đang sử dụng một C-style cho vòng lặp, tôi viết

for (my $i = 0; $i < $n; ++$i) 

nhưng đối với iterating trên một mảng, tôi giải thích rõ ràng

foreach my $x (@a) 

Tôi thấy rằng nó đọc tốt hơn trong đầu của tôi theo cách đó.

+2

Tôi thấy điều ngược lại: Tôi luôn sử dụng 'cho $ x (@a)' của tôi. Tôi thích các chuỗi 'for x in a' của Python, hoặc thậm chí là' for (@a as $ x) 'của PHP. Tôi không bao giờ sử dụng vòng lặp 'for' kiểu C. Tôi sẽ viết những gì bạn có là 'cho $ i của tôi (0 .. $ n)'. Trường hợp đặc biệt của Perl tối ưu hóa để không tạo ra một danh sách không cần thiết, vì vậy sự khác biệt giữa nó và vòng lặp 'for' kiểu C rõ ràng của bạn sẽ không đáng kể, và tôi nghĩ nó dễ đọc hơn theo cách đó. –

+1

@ Chris Lutz: Vì vậy, bạn không bao giờ có nhu cầu làm điều gì đó phức tạp hơn so với 1 của 1? Tôi có thể nghĩ đến một số ứng dụng khác nhau trong đó vòng lặp kiểu C đơn giản là cách tốt nhất để viết nó. Trường hợp đơn giản nhất mà tôi có thể nghĩ ngay bây giờ là muốn kiếm tỷ lệ cược hoặc chỉ phát sinh bằng một cái gì đó như 'for (my $ i = 1; $ i <@x; $ i + = 2) {...}' –

-3

Trong trường hợp "cho" bạn có thể sử dụng ba bước.

1) Khởi 2) Điều kiện Kiểm tra 3) Tăng hoặc giảm

Nhưng trong trường hợp của "foreach" bạn không phải là tăng khả năng hoặc giảm giá trị. Giá trị gia tăng luôn là 1.

+0

Đây là không đúng. Bạn có thể sử dụng cả hai quy ước cú pháp với cả hai từ khóa (cho và foreach) mà không có sự khác biệt về bất kỳ điều gì khác ngoài chính từ khóa đó. –

+0

Nó sẽ lặp lại 5 lần in 12345, chúng tôi không sử dụng các bước được bạn đề cập. 'in $ _ cho (1..5)' –

0

Từ khóa foreach thực sự là từ đồng nghĩa cho từ khóa, vì vậy bạn có thể sử dụng foreach để dễ đọc hoặc ngắn gọn. (Hoặc bởi vì Bourne shell quen thuộc với bạn hơn là csh, vì vậy viết cho tự nhiên hơn.) Nếu VAR bị bỏ qua, $ _ được đặt cho mỗi giá trị.

-2

Có một sự khác biệt tinh tế (http://perldoc.perl.org/perlsyn.html#Foreach-Loops):

Các foreach lặp vòng hơn một giá trị danh sách bình thường và đặt VAR biến là mỗi phần tử của danh sách lần lượt. Nếu biến được đặt trước với từ khóa của tôi, thì biến đó được sắp xếp theo từ điển, và do đó chỉ hiển thị trong vòng lặp. Nếu không, biến là ngầm cục bộ cho vòng lặp và lấy lại giá trị cũ của nó khi thoát khỏi vòng lặp. Nếu biến đã được khai báo trước đó với biến của tôi, biến này sử dụng biến đó thay vì biến số toàn cầu, nhưng biến đó vẫn được bản địa hóa thành vòng lặp. Nội địa hóa ngầm này chỉ xảy ra trong vòng lặp foreach.

chương trình này:

#!/usr/bin/perl -w 

use strict; 

my $var = 1; 
for ($var=10;$var<=10;$var++) { 
    print $var."\n"; # print 10 
    foo(); # print 10 
} 

print $var."\n"; # print 11  

foreach $var(100) { 
    print $var."\n"; # print 100 
    foo(); # print 11 ! 
} 

sub foo { 
    print $var."\n"; 
} 

sẽ sản xuất rằng:

10 
10 
11 
100 
11 
+1

Điều đó được giải thích cũng http://stackoverflow.com/q/5398520/579750 và http://stackoverflow.com/q/2238576/579750. –

+1

Đây thực sự là một câu trả lời sai, vì điều này xảy ra trong cả vòng lặp 'for' và' foreach'. Bạn có thể tự mình thử - nếu bạn lật 'for' và' foreach' trong mã, không có gì xảy ra –

+0

Bạn sai, kết quả là như nhau: foreach gọi hàm foo() in giá trị của var toàn cầu (do đó 1), vì lệnh "for" gọi hàm foo() in giá trị của biến cục bộ $ var (do đó 10) –

0

Từ http://perldoc.perl.org/perlsyn.html#Foreach-Loops

Từ khóa foreach thực sự là một từ đồng nghĩa với các từ khóa, vì vậy bạn cũng có thể sử dụng. Nếu VAR bị bỏ qua, $ _ được đặt thành từng giá trị.

# Perl's C-style 
for (;;) { 
    # do something 
} 

for my $j (@array) { 
    print $j; 
} 

foreach my $j (@array) { 
    print $j; 
} 

Tuy nhiên:

Nếu bất kỳ phần nào của DANH là một mảng, foreach sẽ nhận được rất bối rối nếu bạn thêm hoặc loại bỏ các yếu tố trong cơ thể lặp, ví dụ với mối nối. Vì vậy, đừng làm vậy.

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