intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Learning Perl - Cấu trúc điều khiển

Chia sẻ: AJFGASKJHF SJHDB | Ngày: | Loại File: PDF | Số trang:6

156
lượt xem
14
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

4.1 Khối câu lệnh Khối câu lệnh là một dãy c ác c âu lệnh, được bao trong c ặp dấu ngoặc nhọn ({ và }). Nó trông tựa như thế này: { cau lenh thu nhat; cau lenh thu hai; cau lenh thu ba; ... cau lenh cuoi; } Perl thực hiện từng câu lệnh theo trình tự, từ đầu đến c uối. Về mặt c ú pháp, một khối c ác c âu lệnh được chấp nhận ở mọi vị trí của một câu lệnh.

Chủ đề:
Lưu

Nội dung Text: Learning Perl - Cấu trúc điều khiển

  1. D iễn đàn tin học | Tutorial Room Mục lục «« C hương 3 »» C hương 5 Learning Perl - Chương 4: Cấu trúc điều khiển 1. Khối c âu lệnh 2. Câu lệnh if/else 3. Câu lệnh while/until 4. Câu lệnh do {} while/until 5. Câu lệnh for 6. Câu lệnh foreach 7. Bài t ập 4.1 Khối câu lệnh Khối câu lệnh là một dãy c ác c âu lệnh, được bao trong c ặp dấu ngoặc nhọn ({ v à }). Nó trông tựa như thế này: { cau lenh thu nhat; cau lenh thu hai; cau lenh thu ba; ... cau lenh cuoi; } Perl thực hiện từng câu lệnh theo trình tự, từ đầu đến c uối. Về mặt c ú pháp, một khối c ác c âu lệnh được chấp nhận ở mọi vị trí của một câu lệnh. 4.2 Câu lệnh if/unless Độ phức tạp tiếp theo t rong 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 ác h khác , nó trông tựa như thế này: if (mot bỉeu thuc nao do) { 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 (c ho 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 t rê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 c húng c ho bạn kết quả như dự kiến. Biểu thức điều khiển được tính c ho 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ố t hì nó sẽ được c huyển thành xâu). Nếu xâu này hoặc là xâu rỗng (c hiề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 c oi 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 c ho 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ác h hiểu về c ác giá trị đúng và sai. Sau đây là những
  2. t hí dụ một số c ác h hiểu về đúng(True) và sai(False): # c huyển t hành “0”, c ho nên là sai 0 # c huyển thành 0, rồi c huyển thành "0", c ho nên là sai 1-1 # c huyển t hành "1", nên là đúng 1 # xâu rỗng, c ho nên là sai "" # khong phải là "" hay "0", c ho nên đúng "1" # không phải là "" hay "0", c ho nên là đúng (c hú ý: trường hợp này có huyền ảo) "00" "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) # được xem là "", c ho nên sai undef Về mặt thực hành mà nói, các h 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 = ; 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?" $a = ; 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à c hỉ 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 = ; 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ó t hể c ó một else, như if ). Nếu bạn có nhiều hơn hai c họ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; ... } 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; ...
  3. } 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ỳ ý . 4.3 Câu lệnh while/until Không một ngôn ngữ t huật toán nào lại hoàn chỉnh mà không c ó một dạng lặp nào đó (thực hiện lặp lại một khối c ác c âu lệnh). Perl c ó thể lặp bằng việc dùng c âu lệnh while: while (bieu thuc) { cau lenh 1; cau lenh 2; cau lenh 3; ... } Để thực hiện c âu lệnh while này, Perl tính biểu t hức điều khiển. Nếu giá trị này là đúng (bằng việc dùng ý tưởng về c ái đúng của c âu lệnh if ), thì thân c ủa c âu lệnh w hile s ẽ được tính một lần. Điều này được lặp lại c ho tới khi biểu thức điều khiển trở thành sai, tại điểm đó Perl c huyển sang c âu lệnh t iếp sau while. Chẳng hạn: print "Ban bao nhieu tuoi roi?" $a = ; chop($a); whileless ($a > 0) { print "Vao luc nay ban moi $a tuoi.\n"; $a--; } Đôi khi nói "hãy làm việc đó trong khi điều này sai" lại dễ hơn là nói "hãy làm việc đó trong khi không điều này là đúng”. Một lần nữa, Perl lại c ó c âu trả lời. Thay cho while là until, cũng c ho kết quả mong muốn: until (bieu thuc) { cau lenh 1; cau lenh 2; cau lenh 3; ... } Chú ý rằng trong c ả hai dạng while và until, c ác c âu lệnh thân sẽ bị bỏ qua hoàn toàn nếu biểu t hức điều khiển là giá trị kết thúc ngay từ lúc bắt đầu. Chẳng hạn, nếu người dùng đưa vào một độ tuổi bé hơn 0 c ho đoạn c hương t rình trên (c hương trình w hile) thì Perl sẽ bỏ qua t hân c hu trình. Có thể là biểu thức điều khiển sẽ c hẳng bao giờ để c ho c hu trình thoá ra được . Điều này hoàn toàn hợp pháp, và đôi khi cũng là mong muốn nữa, và do vậy không bị c oi như một lỗi. Chẳng hạn, bạn c ó thể muốn một c hu trình c ứ lặp lại mãi c hừng nào bạn c òn chưa phạm phải lỗi, và rồi c ó một đoạn trình giải quyết lỗi đi theo sau c hu trình.
  4. 4.4 Câu lệnh do {} while/until Câu lệnh while/until mà bạn vừa thấy ở trên sẽ kiểm tra điều kiện trước khi bắt đầu vào vòng lặp c ủa chu trình. Nếu như điều kiện sai ngay từ đầu thì phần thân của chu trình sẽ không bao giờ được thực hiện. Tuy nhiên thỉnh thoảng bạn không muốn điều kiện được kiểm tra ngay từ đầu. T hay vào đó bạn muốn kiểm tra điều kiện ở c uối vòng lặp. Để đáp ứng điều này, Perl c ung cấp c ho bạn c âu lệnh do {} while, nó tương t ự như c âu lệnh w hile ở t rên nhưng nó chỉ bắt đầu kiểm tra điều kiện khi vòng lặp được thực hiện ít nhất 1 lần. do { cau lenh 1; cau lenh 2; cau lenh 3; ... } while (bieu thuc); Perl thực hiện c ác c âu lệnh trong phần thân c ủa do. Sau khi c âu lệnh c uối c ùng kết thúc, Perl sẽ thực hiện v à kiểm tra biểu thức. Nếu như biểu thức là sai, chu trình sẽ kết thúc , nếu là đúng, c hu trình sẽ tiếp tục được thực hiện lại một lần nữa và Perl lại tiếp tục kiểm tra giá trị c ủa biểu thức . Tương tự như với w hile, bạn có thể c huyển do while t hành do until. Biểu t hức điều kiện vẫn được kiểm tra ở c uối vòng lặp. Nhưng c hu trình sẽ kết thúc nếu như điều kiện là đúng, còn nếu sai vòng lặp sẽ tiếp tục (nghĩa là ngược với do while). do { cau lenh 1; cau lenh 2; cau lenh 3; ... } until (bieu thuc); 4.5 Câu lệnh for Một kết cấu lặp khác của Perl là câu lệnh f or, mà trông giống như câu lệnh for c ủa C, và làm việc thì đại thể c ũng giống thế. Sau đây là nó: for (bieu thuc khoi dau; bieu thuc kiem tra; bieu thuc tang bien dem) { cau lenh 1; cau lenh 2; cau lenh 3; .... } Gỡ ra theo dạng ta đã thấy trước đây, điều này trở thành bieu thuc khoi dau; while (bieu thuc kiem tra) { cau lenh 1; cau lenh 2; cau lenh 3; .... bieu thuc tang; } Trong c ả hai trường hợp, biểu thức khởi đầu đều được tính trước. Biểu thức này về điển hình c hỉ gán giá trị ban đầu cho một biến lặp, nhưng cũng c hẳng c ó hạn c hế nào về việc nó có thể chứa cái gì - trong thực t ế nó c ó thể rỗng. Rồi biểu thức kiểm tra sẽ được t ính để xác định đúng sai. Nếu giá trị tính được là đúng thì thân chu trình sẽ được thực hiện, tiếp theo đó là tính biểu thức tăng (mà điển hình là được dùng để tăng bộ lặp). Perl tiếp đó sẽ tính lại biểu thức kiểm tra, lặp lại khi c òn c ần. Thí dụ này in ra c ác số từ 1 đến 10, mỗi số đều c ó sau nó một dấu các h:
  5. for ($i = 1; $i
  6. Bạn hãy c hú ý đến việc thay đổi $one t rong 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. 4.7 Bài tập 1. Bạn hãy viết một c hương trình hỏi người dùng nhập vào nhiệt độ trong phòng, sau đó in ra dòng c hữ "nóng quá" nếu nhiệt độ lớn hơn 72oC, và in ra "lạnh quá" trong trường hợp ngược lại. 2. Hãy sửa lại c hương trình bạn vừa mới viết 1 c hút để nó in ra "nóng quá" nếu nhiệt độ lớn hơn 75oC, "lạnh quá" nếu nhiệt độ nhỏ nhơn 68oC và in ra "được rồi" nếu nhiệt độ từ 68o C đến 75o C. 3. Bạn hãy viết c hương trình nhập vào một danh sách các số (mỗi số trên 1 dòng) c ho đến khi số 999 được đọc vào. Sau đó in ra tổng c ác số vừa đọc được (không tính số 999). Ví dụ: nếp bạn nhập 1,2,3 và 999 thì c hương trình sẽ in ra 6. 4. Bạn hãy viết 1 c hương trình đọc vào một danh sác h c ác xâu (mỗi xâu một dòng) và in ra danh sác h c ác xâu đó theo thứ tự đảo ngược (không dùng toán t ử r everse). 5. Bạn hãy viết 1 c hương trình in ra 1 bảng c ác số từ 0 đến 32 và bình phương c ủa số đó. Nghĩa là c hương trình sẽ in ra: 0 0 1 1 2 4 ... Để in số được đẹp hơn, bạn có thể dùng hàm printf: printf "%3$a %5$b\n", $a, $b Tương tự như trong C, lệnh printf trên sẽ in ra 2 số $a và $b trên 1 dòng với $a được c anh lề 3 ký tự và $b là 5 ký tự Mục lục «« C hương 3 »» C hương 5
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2