Tài liệu Ngôn ngữ Perl-Chương 09-Cấu trúc điều khiển khác doc - Pdf 84

Learning Perl - Chương 8: Các cấu trúc điều khiển khác
1. Xác định một hàm tiện ích
2. Gọi một hàm tiện ích
3. Giá trị trả về
4. Đối số của hàm
5. Biến cục bộ trong hàm
6. Bài tập
9.1 Toán tử last
Toán tử last tương đương câu lệnh break của C, để thoát sớm khỏi chu trình.
Toán tử last ngắt khối chu trình bao quanh ở bên trong nhất, gây ra việc thực hiện tiếp tục với câu lệnh đi ngay
sau khối đó. Chẳng hạn:
while (something) {
something;
something;
something;
if (somecondition) {
somethingother;
somethingother;
lase; #thoat khoi chu trinh while
}
morething;
morething;
}
#last se nhay den cho nay
Nếu somecondition là đúng (true), thì somethingother sẽ được thực hiện, và cuối cùng toán tử last buộc chu
trình while phải kết thúc.
Toán tử last chỉ tính tới khối chu trình, không tính khối cần để tạo nên kết cấu cú pháp nào đó. Điều này có
nghĩa là khối tạo nên câu lệnh if hay else hoặc do không được tính tới - chỉ khối tạo nên for, foreach, while và
khối "trần" mới được tính (khối "trần" là khối không thuộc phần khác của một kết cấu lớn hơn, như một chu
trình, hay một trình con, hay một câu lệnh if/then/else).
Giả sử tôi muốn xem liệu thông báo thư đã được cất giữ trong một tệp có là từ merlyn hay không. Một thông

phan_thu_nhat;
...
if (dieu_kien) {
phan_nao_do;
...
next; #nhay den cuoi chu trinh while
}
phan_khac;
...
#next se nhay toi day
}
Nếu dieu_kien là đúng, thì phan_nao_do sẽ được thực hiện và phan_khac sẽ bị bỏ qua (nếu dieu_kien là sai
thì phan_nao_do sẽ không được thực hiện và phan_khac sẽ được thực hiện như bình thường)
Một lần nữa, khối của một câu lệnh if không được tính tới như khối chu trình.
9.3 Toán tử redo
Cách thứ ba mà bạn có thể nhảy qua trong một khối chu trình là bằng cách dùng toán tử redo. Toán tử này nhảy
tới chỗ bắt đầu của khối hiện tại (không tính lại biểu thức điều kiện), kiểu như:
while (cai_gi_do) {
#redo se nhay toi cho nay
phan_1;
...
if (dieu_kien_nao_do) {
phan_nao_do;
...
redo;
}
phan_khac;
...
}
Một lần nữa, khối if không được tính tới. Chỉ tính các khối chu trình.

...
if (dieu_kien_khac) {
last NHAN;
}
}
Lưu ý rằng ta đã thêm NHAN, như một tham biến vào câu lệnh last. Tham biến này bảo cho Perl ra khỏi khối có
tên NHAN, thay vì ra khỏi khối bên trong nhất. Trong trường hợp này, chúng ta không có cái gì khác ngoài khối
bên trong nhất. Nhưng giả sử có các chu trình lồng nhau:
OUTER:
for ($i = 1; $i <= 10; $i++) {
INNER:
for ($j = 1; $j >= 10; $j++) {
if ($i * $j == 63) {
print "$i x $j = 63!\n";
last OUTER;
}
if ($j >= $i) {
next OUTER ;
}
}
}
Tập hợp các câu lệnh này thử tất cả các giá trị kế tiếp của hai số nhỏ nhất được nhân với nhau cho tới khi nó tìm
ra một cặp có tích là 63 (7 và 9). Lưu ý rằng một khi đã tìm được một cặp thì không cần phải kiểm tra các số
khác nữa, cho nên câu lệnh if thứ nhất ra khỏi cả hai chu trình for bằng việc dùng last với nhãn OUTER. Câu
lệnh if thứ hai cố gắng đảm bảo rằng số lớn hơn trong hai số bao giờ cũng là số thứ nhất bằng việc bỏ qua việc
lặp tiếp của chu trình bên ngoài ngay khi điều kiện này không còn xảy ra nữa. Điều này có nghĩa là các số sẽ
được kiểm thử với ($i, $j) sẽ là (1,1), (2,1), (2,2), (3,1), (3,2), (3,3), (4,1)...
Cho dù khối bên trong nhất được gắn nhãn, thì các toán tử last, next, và redo không có tham biến tuỳ chọn
(nhãn) vẫn vận hành tôn trọng khối bên trong nhất. Cũng vậy, bạn không thể dùng nhãn để vào trong một khối -
chỉ để ra khối. Các toán tử last, next hay redo phải ở bên trong khối.

coi là các cấu trúc điều khiển không? Thế này, theo cách nghĩ Perl, gần như bất kì cái gì cũng đều có thể cả, cho
nên bạn hãy xem điều tôi nói ở đây.
Thông thường, bạn bắt gặp "nếu cái này, thì cái nọ". Trước đây chúng ta đã thấy hai dạng này:
if (cai_nay) { cai_no } #một cách
cai_no if cai_nay; #cách khác
Đây là cách thứ ba (có thể vẫn còn nữa đấy):
cai_nay && cai_no;
Tại sao nó lại làm việc? Nó chẳng phải là toán tử logic "và" sao? Uhh, bạn hãy kiểm tra xem cái gì xảy ra khi
cai_nay lấy giá trị TRUE hay FALSE:
• Nếu cai_nay là TRUE, thế thì giá trị của toàn bộ biểu thức vẫn còn chưa được biết tới,
vì nó phụ thuộc vào giá trị của cai_kia. Cho nên cai_kia phải được tính.
• Nếu cai_nay là FALSE thế thì chẳng cần nhìn vào cai_kia nữa, bởi vì lúc này giá trị
của toàn bộ biểu thức phải là FALSE rồi. Vì chằng cần gì phải tính cai_kia nên chúng
ta có thể bỏ qua.
Và trong thực tế, đây là điều mà Perl làm. Perl tính cai_kia chỉ khi cai_nay là đúng, làm cho nó thành tương
đương với hai dạng trước.
Giống thế, toán tử logic hoặc giống như câu lệnh unless (hay bộ sửa đổi unless). Cho nên bạn có thể thay thế:
unless (cai_nay) { cai_kia }
bằng
cai_nay || cai_kia;
Nếu bạn quen thuộc với việc dùng các toán tử này trong các chương trình shell để kiểm soát các chỉ lệnh thực
hiện điều kiện, thì bạn sẽ thấy rằng chúng vận hành tương tự trong Perl.
Cuối cùng toán tử ba ngôi kiểu C:
exp1 ? exp2 : exp3;
tính exp2 nếu exp1 đúng, ngược lại tính exp3. Cũng dường như là chúng ta nói:
if (exp1) { exp2 } else { exp3 }
nhưng một lần nữa không có tất cả các dấu ngắt đó. Chẳng hạn, bạn có thể viết:
($a < 10) ? $b = $a : $a = $b;
Ta nên dùng cái nào đây? Tuỳ vào tâm trạng bạn thôi, đôi khi, hay tuỳ theo từng phần biểu thức lớn đến đâu,
hay liệu ta cần thêm đóng mở ngoặc nào bởi vì sự xung khắc thứ tự ưu tiên. Bạn hãy nhìn vào chương trình của


Nhờ tải bản gốc
Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status