Các cấu trúc điều khiển khác
Toán tử last
Trong một số bài tập trớc đây bạn có thể đã nghĩ, Nếu tôi có đợc một câu lệnh
break của C ở đây, thì đã xong rồi. Cho dù bạn không nghĩ nh thế, thì hãy cứ để tôi
nói cho bạn về sự tơng đơng của Perl để thoát sớm khỏi chu trình : toán tử last.
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 (cái gì đó) {
cái gì đó ;
cái gì đó ;
cái gì đó ;
if (điều kiện nào đó) {
cái gì đó khác ;
cái gì đó khác ;
last ; # nhẩy ra khỏi chu trình while
}
thêm nữa ;
thêm nữa ;
}
# last nhẩy tới đây
Nếu điều kiện nào đó là đúng, thì cái gì đó khác sẽ đợc thực hiện, và thế rồi 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 nhánh then của câu lệnh if không đợc
tính tới - chỉ khối tạo nên for, foreach, while và các 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ừ tôi
hay không. Một thông báo nh vậy có thể giống nh là:
From: (Randal L. Schwartz)
To:
phần thứ nhất ;
if (điều kiện nào đó) {
phần nào đó ;
phần nào đó ;
next ; # nhẩy ra khỏi chu trình while
}
phần khác ;
phần khác ;
# next tới đây
}
Nếu điều kiện nào đó là đúng, thì phần nào đó đợc thực hiện, và phần khác bị bỏ
qua.
*
*
Nếu có một khối continue cho chu trình này, mà chúng ta thì cha thảo luận tới, thì toán tử next đi tới chỗ bắt đầu của
khối continue thay vì tới cuối khối này. Khá gần.
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.
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 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 (cái gì đó) {
# redo tới đây
cái gì đó ;
cái gì đó ;
cái gì đó ;
if (điều kiện nào đó) {
phần nào đó ;
phần nào đó ;
redo ;
nh vô hớng, mảng, mảng kết hợp và trình con. Tuy nhiên, nh chúng ta thấy, một nhãn
không có kí tự ngắt đi đầu đặc biệt (nh $ cho vô hớng, & cho trình con, vân vân), cho
nên một nhãn có tên print sẽ xung đột với từ dành riêng print và sẽ không đợc phép.
Bởi lí do này, Larry gợi ý bạn hãy chọn các nhãn bao gồm toàn chữ hoa và số, mà anh
ấy đảm bảo sẽ không bao giờ bị chọn nhầm thành một từ dành riêng trong tơng lai.
Bên cạnh đó, tất cả các chứ hoa cho phép dễ nhìn thấy hơn trong một văn bản chơng
trình mà phần lớn là chữ thờng.
Một khi bạn đã chọn cẩn thận nhãn, thì nó sẽ đứng ngay trớc câu lệnh có chứa
khối, theo sau dấu hai chấm, kiểu nh thế này:
SOMELABEL: while (điều kiện) {
câu lệnh ;
câu lệnh ;
câu lệnh ;
if (điều kiện khác) {
last SOMELABEL ;
}
}
L ý rằng tôi đã thêm SOMELABEL, 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 SOMELABEL, 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. Nhng giả sử tôi 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 lần $j là 63!\n ;
last OUTER;
}
if ($j >= $i) {
next OUTER ;
}
LINE: while (<STDIN>) {
last LINE if /^From: / ;
}
Bạn xem dễ viết làm sao. Và bạn thậm chí còn có thể đọc nó theo kiểu tiếng Anh:
dòng cuối nếu nó bắt đầu với From.
Các dạng song song khác bao gồm những dạng sau:
exp2 unless exp1; # giống: unless (exp1) { exp2 ; }
exp2 while exp1; # giống: while (exp1) { exp2 ; }
exp2 until exp1; # giống: util (exp1) { exp2 ; }
L ý rằng tất cả các dạng này đều tính exp1 trớc rồi dựa trên đó, tính hay không
tính cái gì đó với exp2.