Câu lệnh if/unless:

Một phần của tài liệu Phân tích Cấu trúc chương trình Perl, các kiểu dữ liệu và các thao tác trên dữ liệu (Trang 51)

4. Các lệnh điều khiển chương trình: Khối các câu lệnh:

4.1Câu lệnh if/unless:

Độ phức tạp tiếp theo trong các câu lệnh là câu lệnh if. Kết cấu này trông rất giống kết cấu trong C: một biểu thức điều khiển (được tính theo tính đúng đắn của nó), và hai khối. Nói cách khác, nó trông tựa như thế này:

cau lenh 1 trong truong hop dung ; cau lenh 2 trong truong hop dung ; cau lenh 3 trong truong hop dung ; ...

} else {

cau lenh 1 trong truong hop sai ; cau lenh 2 trong truong hop sai ; cau lenh 3 trong truong hop sai ; ...

}

Dấu ngoặc móc { và } ở đây là cần thiết (cho dù bạn chỉ có một lệnh trong phần if hoặc else), nếu bạn thiếu thì Perl sẽ báo lỗi cú pháp.

Trong khi thực hiện, Perl sẽ tính biểu thức điều khiển. Nếu biểu thức này là đúng thì khối thứ nhất (các câu lệnh trong trường hợp đúng trên) sẽ được thục hiện. Nếu biểu thức là sai thì khối thứ hai (các câu lệnh trong trường hợp sai trên) sẽ được thực hiện. Nhưng đúng sai là như thế nào? Trong Perl, các qui tắc có đôi chút hơi huyền ảo, nhưng chúng cho bạn kết quả như dự kiến. Biểu thức điều khiển được tính cho một giá trị xâu (nếu nó đã là xâu, thì chẳng có thay đổi gì, nhưng nếu nó là số thì nó sẽ được chuyển thành xâu). Nếu xâu này hoặc là xâu rỗng (chiều dài không), hoặc là một xâu có chứa một kí tự "0" (không), thì giá trị của biểu thức là sai (False). Mọi thứ khác đều được tự động coi như là đúng (True). Tại sao lại có cái qui tắc buồn cười này vậy? Vì điều ấy làm cho dễ dàng nhẩy theo cái rỗng so với một xâu khác rỗng, cũng như số không so với số khác không, không cần phải tạo ra hai cách hiểu về các giá trị đúng và sai. Sau đây là những thí dụ một số cách hiểu về đúng(True) và sai(False):

1-1 # chuyển thành 0, rồi chuyển thành "0", cho nên là sai 1 # chuyển thành "1", nên là đúng

"" # xâu rỗng, cho nên là sai

"1" # khong phải là "" hay "0", cho nên đúng

"00" # không phải là "" hay "0", cho nên là đúng (chú ý: trường hợp này có huyền ảo) "0.000" # cũng đúng với cùng lí do (đồng thời bạn sẽ nhận đuợc 1 warning từ Perl) undef # được xem là "", cho nên sai

Về mặt thực hành mà nói, cách hiểu các giá trị đúng sai thì khá trực giác. Sau đây là một thí dụ về câu lệnh if đầy đủ:

print "Ban bao nhieu tuoi roi?" $a = <STDIN>;

chop($a); if ($a < 18) {

print "Nay, bạn chua du tuoi bau cu dau nhe!\n"; } else {

print "Du tuoi roi! Hay binh than! Vay di bau cu di!\n"; $votes++; # den so phieu

}

Bạn có thể cắt bỏ khối else như trong: print "Ban bao nhieu tuoi roi?"

chop($a); if ($a < 18) {

print "Nay, bạn chua du tuoi bau cu dau nhe!\n"; }

Đôi khi, bạn muốn bỏ đi phần if mà chỉ có phần else, vì sẽ tự nhiên hơn để nói "hãy làm điều đó nếu điều này sai" so với "làm điều đó nếu điều không điều này là đúng". Perl giải quyết điều này với biến thể unless:

print "Ban bao nhieu tuoi roi?" $a = <STDIN>;

chop($a);

unless ($a < 18) {

print "Du tuoi roi! Hay binh than! Vay di bau cu di!\n"; $votes++; # den so phieu

}

Việc thay thế if bằng unless là có hiệu quả khi nói "Nếu biểu thức điều khiển là không đúng thì hãy làm..." (một unless cũng có thể có một else, như if).

Nếu bạn có nhiều hơn hai chọn lựa thì bạn có thể thêm một nhánh elsif vào câu lệnh if, giống như:

if (bieu thuc so 1) {

cau lenh 1 trong truong hop dung 1; cau lenh 2 trong truong hop dung 1; cau lenh 3 trong truong hop dung 1;

... (adsbygoogle = window.adsbygoogle || []).push({});

} elsif (bieu thuc so 2) {

cau lenh 1 trong truong hop dung 2; cau lenh 2 trong truong hop dung 2; cau lenh 3 trong truong hop dung 2; ...

} elsif (bieu thuc so 3) {

cau lenh 1 trong truong hop dung 3; cau lenh 2 trong truong hop dung 3; cau lenh 3 trong truong hop dung 3; ...

} else {

cau lenh 1 trong truong hop sai tat ca; cau lenh 2 trong truong hop sai tat ca; cau lenh 3 trong truong hop sai tat ca; ...

}

Mỗi biểu thức (ở đây, bieu thuc so 1, bieu thuc so 2, và bieu thuc so 3) đều được tính lần lượt. Nếu một biểu thức là đúng thì nhánh tương ứng sẽ được thực hiện, và tất cả phần còn lại của biểu thức điều khiển cũng các nhánh câu lệnh sẽ bị bỏ qua. Nếu tất cả các biểu thức này đều sai thì nhánh else sẽ được thực hiện (nếu có). Bạn có thể có nhiều nhánh else-if (elsif) tuỳ ý.

Một phần của tài liệu Phân tích Cấu trúc chương trình Perl, các kiểu dữ liệu và các thao tác trên dữ liệu (Trang 51)