4. Các lệnh điều khiển chương trình: Khối các câu lệnh:
4.5 Câu lệnh foreach:
Vẫn còn một kết cấu lặp khác là câu lệnh foreach. Câu lệnh này rất giống như câu lệnh foreach của C-shell: nó nhận một danh sách các giá trị và mỗi lần lại gán chúng cho một biến vô hướng, rồi thực hiện một khối mã cùng với việc gán đó. Nó trông tựa như thế này: foreach $i (@danh_sach_nao_do) { cau lenh 1; cau lenh 2; cau lenh 3; .... }
Không giống với C-shell, giá trị nguyên gốc của biến vô hướng được tự động khôi phục khi chu trình đi ra - nói cáhc khác, biến vô hướng là cục bộ cho chu trình.
Sau đây là một thí dụ về foreach: @a = (1,2,3,4,5);
foreach $b (reverse @a) { print $b;
Mẩu chương trình này in ra 54321. Chú ý rằng danh sách được foreach sử dụng có thể là một biểu thức danh sách bất kì, không chỉ là một biến mảng. (đây là điển hình cho phần lớn các kết cấu Perl có yêu cầu một danh sách). Bạn có thể bỏ tên của biến vô hướng, trong trường hợp đó Perl giả thiết rằng bạn đã xác định dùng tên biến $_. Bạn sẽ thấy rằng biến $_ được dùng như mặc định cho nhiều phép toán Perl (Tất cả các phép toán có dùng $_ theo mặc định cũng đều có thể dùng một biến vô hướng thông thường). Chẳng hạn, toán tử print in ra giá trị của $_ nếu không có giá trị nào khác được xác định, cho nên thí dụ sau đây sẽ làm việc như thí dụ trước:
@a = (1,2,3,4,5); foreach (reverse @a) { print ;
}
Bạn xem việc dùng biến $_ làm đơn giản hơn bao nhiêu không? (Hay ít nhất thì cũng ngắn hơn).
Nếu danh sách mà bạn đang lặp được tạo nên từ một tham khảo biến mảng đơn, thay vì một toán tử nào đó mà cho lại một giá trị danh sách, thì biến vô hướng đang được dùng cho lặp trong thực tế lại là tham khảo tới từng phần tử của mảng đó, thay vì là bản sao của các giá trị đó. Điều này ngụ ý gì theo nghĩa thông thường? Nó có nghĩa là nếu bạn thay đổi biến vô hướng thì bạn cũng thay đổi phần tử đặc biệt trong mảng mà biến đó đang đại diện cho. Chẳng hạn:
@a = (3,5,7,9); foreach $one (@a) { $one *= 3;
}
Bạn hãy chú ý đến việc thay đổi $one trong thực tế làm thay đổi từng phần tử của @a, đây là một tính năng của Perl, không phải là lỗi.