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ì?
Trả lời
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óafor
, vì vậy bạn có thể sử dụngforeach
để có thể đọc hoặcfor
cho ngắn gọn.
Bốn chữ cái.
Chúng là
chức năng
giống hệt nhau, chỉ được viết khác nhau.
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. –
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 đó.
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 đó. –
@ 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) {...}' –
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.
Đâ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 đó. –
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)' –
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ị.
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
Điều đó được giải thích cũng http://stackoverflow.com/q/5398520/579750 và http://stackoverflow.com/q/2238576/579750. –
Đâ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 –
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) –
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.
- 1. Sự khác nhau giữa "||" là gì và "hoặc" trong Perl?
- 2. Sự khác nhau giữa 'eq' và '= ~' trong Perl là gì?
- 3. Sự khác nhau giữa for..in và cho mỗi..in trong javascript là gì?
- 4. Sự khác nhau giữa Vanilla Perl và Strawberry Perl là gì?
- 5. Tiêu đề HTTP: Sự khác nhau giữa X-FORWARDED-FOR, X_FORWARDED_FOR và HTTP_X_FORWARDED_FOR là gì?
- 6. Sự khác nhau giữa một đối tượng và một lớp trong Perl là gì?
- 7. Sự khác nhau giữa `base base` và @ISA trong Perl là gì?
- 8. Sự khác nhau giữa BAREWORD và * BAREWORD trong Perl là gì?
- 9. Sự khác nhau giữa dấu nháy đơn và dấu ngoặc kép trong Perl là gì?
- 10. Trong Perl, sự khác nhau giữa s/^ \ s + // và s/\ s + $ // là gì?
- 11. Sự khác nhau giữa ($ variableName) và $ variableName của tôi trong Perl là gì?
- 12. Sự khác nhau giữa cat_id và term_id là gì?
- 13. Trong Python, sự khác nhau giữa ".append()" và "+ = []" là gì?
- 14. Sự khác nhau giữa == và = trong Prolog là gì?
- 15. Sự khác nhau giữa // và /// trong Visual Studio là gì?
- 16. Sự khác nhau giữa: = và + = trong tạo tệp là gì?
- 17. Sự khác nhau giữa * và. * Trong MATLAB là gì?
- 18. Sự khác nhau giữa $ @ và $ * trong UNIX là gì?
- 19. Sự khác nhau giữa: = và = trong MySQL là gì?
- 20. Sự khác nhau giữa 'và #' trong Lisp là gì?
- 21. Sự khác nhau giữa & chức năng và function() trong perl
- 22. Sự khác nhau giữa FUTEX_WAIT và FUTEX_WAIT_PRIVATE là gì?
- 23. Sự khác nhau giữa AssemblyVersion, AssemblyFileVersion và AssemblyInformationalVersion là gì?
- 24. Sự khác biệt giữa $ @ và $! trong perl
- 25. Sự khác nhau giữa NaN và None là gì?
- 26. Sự khác nhau giữa init() và window.init() là gì?
- 27. Sự khác nhau giữa khả năng perl và java regex là gì?
- 28. Sự khác nhau giữa Perl, Python, AWK và sed là gì?
- 29. Sự khác nhau giữa VCS và SCM là gì?
- 30. Sự khác nhau giữa ssize_t và ptrdiff_t là gì?
+1: chào mừng bạn đến stackoverflow :) – Sarfraz
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ự. :) –