1. Trang chủ
  2. » Công Nghệ Thông Tin

Learning Perl - Dữ liệu vô hướng part 1 ppt

5 255 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Diễn đàn tin học | Tutorial Room Mục lục «« Chương 1 »» Chương 3 Learning Perl - Chương 2: Dữ liệu vô hướng 1. Dữ liệu vô hướng là gì? 2. Số 3. Xâu 4. Toán tử 5. Biến vô hướng 6. Các phép toán trên biến vô hướng 7. <STDIN> xem như một vô hướng 8. Đưa ra bằng print() 9. Giá trị undef 10. Bài tập 2.1 Dữ liệu vô hướng là gì? Vô hướng là loại dữ liệu đơn giản nhất mà Perl thao tác. Một vô hướng thì hoặc là một số (giống như 4 hay 3.25e20) hay một xâu các kí tự (giống Xin chào hay Gettysburg Address). Mặc dầu bạn có thể nghĩ về số và xâu như những vật rất khác nhau, nhưng Perl dùng chúng gần như là giống nhau, cho nên chúng ta sẽ nghiên cứu cả hai. Một giá trị vô hướng có thể được tác động bởi các toán tử (giống như phép cộng hay ghép), và kết quả trả về nói chung là một kết quả vô hướng. Một giá trị vô hướng có thể được cất giữ vào trong một biến vô hướng. Các biến vô hướng có thể được đọc từ tệp và thiết bị, và có thể được ghi thiết bị xuất. 2.2 Số Mặc dầu kiểu vô vô hướng thì hoặc là một số hay một xâu, nhưng cũng vẫn có ích khi ta nhìn vào các số và xâu tách biệt nhau trong một chốc lát. Ta sẽ xét số trước rồi đến xâu 2.2.1 Tất cả các số đều có cùng định dạng bên trong Như bạn sẽ thấy trong vài đoạn tiếp đây, bạn có thể xác định cả số nguyên (toàn bộ số, giống như 14 hay 342) và số dấu phẩy động (số thực với dấu chấm thập phân, như 3.14 hay 1.35*10 25 ). Nhưng bên trong, Perl chỉ tính với các giá trị dấu phẩy động độ chính xác gấp đôi. Điều này có nghĩa là không có giá trị nguyên bên trong Perl - một hằng nguyên trong chương trình được xử lí như giá trị dấu phẩy động tương đương. Bạn có lẽ không để ý đến việc chuyển đổi (hay quan tâm nhiều), nhưng bạn nên dừng tìm kiếm phép toán nguyên (xem như ngược với các phép toán dấu phẩy động), vì không có phép tính nào như vậy đâu. 2.2.2 Hằng kí hiệu động Hằng kí hiệu là một cách để biểu diễn một giá trị trong văn bản chương trình Perl - bạn cũng có thể gọi điều này là một hằng trong chương trình mình, nhưng tôi sẽ dùng thuật ngữ hằng kí hiệu. Hằng kí hiệu là cách thức biểu diễn dữ liệu trong mã chương trình gốc của chương trình bạn như cái vào cho trình biên dịch Perl (dữ liệu được đọc từ hay ghi lên các tệp đều được xử lí tương tự, nhưng không đồng nhất). Perl chấp nhận tập hợp đầy đủ các hằng kí hiệu dấu phẩy động có sẵn cho người lập trình C. Số có hay không có dấu chấm thập phân đều được phép (kể cả tiền tố cộng hay trừ tuỳ chọn), cũng như phần chỉ số mũ phụ thêm (kí pháp luỹ thừa) với cách viết E. Chẳng hạn: 1.25 # một và 1 / 4 7.25e45 # 7,25 x 10 45 (một số dương lớn) -6.5e24 # -6,5 x 10 24 (một số âm lớn) -12e-24 # -12 x 10 -24 (một số âm rất nhỏ) -1.2E-23 # tương tự như số ở trên: -1,2 x 10 -23 2.2.3 Hằng kí hiệu nguyên Các hằng kí hiện nguyên cũng được ghi trực tiếp, ví dụ: 12 15 -2004 3485 Bạn đừng bắt đầu một số bằng 0 (zero), vì Perl hỗ trợ cho hằng kí hiệu hệ cơ số tám và hệ mười sáu (hệt như kiểu C). Số hệ tám bắt đầu bằng số 0 đứng đầu, còn số hệ mười sáu thì bắt đầu bằng 0x hay 0X. Các chữ số hệ mười sáu từ A đến F (trong cả hai kiểu chữ hoa thường) đều biểu thị cho các giá trị số qui ước từ 10 đến 15. Chẳng hạn: 0377 # 377 hệ tám = 255 trong hệ thập phân -0xff # âm FF hệ mười = -255 trong hệ thập phân 2.3 Xâu Xâu là một dãy các kí tự (như Xin chào). Mỗi kí tự đều là một giá trị 8-bit trong toàn bộ tập 256 kí tự (không có gì đặc biệt về kí tự NULL như trong C). Xâu ngắn nhất có thể được là xâu rỗng-không có kí tự nào. Xâu dài nhất thì chiếm trọn bộ nhớ máy tính (mặc dầu bạn sẽ chẳng thể nào làm gì nhiều với nó cả). Điều này phù hợp với nguyên lí "không có giới" mà Perl cung cấp cho bạn. Các xâu điển hình là các dẫy in được gồm các chữ, số và dấu ngắt trong phạm vi ASCII 32 tới ASCII 126. Tuy nhiên, khả năng để có bất kì kí tự nào từ 0 tới 255 trong một xâu có nghĩa là bạn có thể tạo ra, 'nhòm' qua, và thao tác dữ liệu nhị phân thô như các xâu - một cái gì đó mà phần lớn các trình tiện ích UNIX khác sẽ gặp khó khăn lớn. (chẳng hạn, bạn có thể 'vá lỗi' UNIX bằng việc đọc nó vào trong xâu Perl, tiến hành thay đổi, và ghi lại kết quả). Giống như số, xâu có thể biểu diễn hằng kí hiệu (cách thức bạn biểu diễn xâu trong chương trình Perl). Các xâu hằng kí hiệu có theo hai hướng: xâu nháy đơn và xâu nháy kép. 2.3.1 Xâu dấu nháy đơn Xâu dấu nháy đơn là một dẫy các kí tự được bao trong dấu nháy đơn ('). Dấu nháy đơn không phải là một phần của bản thân xâu - chúng chỉ có đó để Perl xác định chỗ bắt đầu và kết thúc của xâu. Bất kì kí tự nào nằm giữa các dấu nháy (kể cả dấu xuống dòng, nếu xâu vẫn còn tiếp tục sang dòng sau) đều là hợp pháp bên trong xâu. Hai ngoại lệ: để lấy được một dấu nháy đơn trong một xâu có nháy đơn, bạn hãy đặt trước nó một dấu sổ chéo ngược. Và để lấy được dấu sổ chéo ngược trong một xâu có nháy đơn, bạn hãy đặt trước dấu sổ chéo ngược nột dấu sổ chéo ngược nữa. Ví dụ: 'hello' # năm kí tự: h, e, l, l, o 'dont\'t' # năm kí tự: d, o, n, nháy đơn, t '' # xâu rỗng (không có kí tự) 'silly\\me' # silly, theo sau là một sổ chéo ngược, sau là me "hello\n' # hello theo sau là sổ chéo ngược và n 'hello there' # hello, xuống dòng, there (toàn bộ 11 kí tự) Chú ý rằng \n bên trong môt xâu có nháy đơn thì không được hiểu là dòng mới, nhưng nếu là hai kí tự sổ chéo ngược thì khác (chỉ khi sổ chéo ngược đi theo sau bởi một sổ chéo ngược khác hay một dấu nháy đơn thì mới mang nghĩa đặc biệt). 2.3.2 Xâu dấu nháy kép Xâu dấu nháy kép hành động hệt như xâu trong C. Một lần nữa, nó lại là dãy các kí tự, mặc dầu lần này được bao bởi dấu ngoặc kép. Nhưng bây giờ dấu sổ chéo ngược lấy toàn bộ sức mạnh của nó để xác định các kí tự điều khiển nào đó, hay thậm chí bất kì kí tự nào qua các biểu diễn hệ tám hay hệ mười sáu. Đây là một số xâu dấu nháy kép: "hello world\n" # hello world, và dấu xuống dòng "new \177" # new, dấu cách và kí tự xoá (177 hệ tám) "coke\tsprite" # coke, dấu tab, và sprite Dấu sổ chéo có thể đứng trước nhiều kí tự khác nhau để hàm ý những điều khác nhau (về điển hình nó được gọi là lối thoát sổ chéo). Danh sách đầy đủ của các lối thoát xâu nháy kép được cho trong Bảng 2-1. Bảng 2-1 Dấu sổ chéo ngược trong xâu nháy kép Kết cấu Ý nghĩa \n xuống dòng mới \r về đầu dòng \t ký tự tab \f báo hết trang \b xoá lui 1 ký tự \a phát 1 tiếng "bíp" \e escape \007 ký tự ASCII ở hệ tám (007=bíp) \0x7f ký tự ASCII ở hệ mười sáu (7f=delete) \cC ký tự điều khiển (ở đây là Ctrl-C) \\ dấu sổ chéo ngược \" dấu nháy kép \l ký tự tiếp theo sẽ chuyển thành chữ thường \L tất cả các ký tự tiếp theo cho tới \E sẽ thành chữ thường \u ký tự tiếp theo sẽ chuyển thành chữ hoa \U tất cả các ký tự tiếp theo cho tới \E sẽ thành chữ hoa \E kết thúc \L hay \U Một tính năng khác của xâu nháy kép là ở chỗ chúng cho phép chen lẫn các biến, nghĩa là một số tên biến nào đó bên trong xâu được thay thế bởi giá trị hiện tại của chúng khi xâu được dùng. Chúng ta đã không được giới thiệu một cách chính thức là các biến trông như thế nào (ngoại trừ trong phần mở đầu trên), cho nên tôi sẽ quay lại vấn đề này sau. 2.4 Toán tử Một toán tử tạo ra một giá trị mới (kết quả) từ một hay nhiều giá trị khác (các toán hạng). Chẳng hạn, + là một toán tử vì nó nhận hai số (toán hạng, như 5 và 6), và tạo ra một giá trị mới (11, kết quả). Các toán tử và biểu thức của Perl nói chung đều là siêu tập của các toán tử đã có trong hầu hết các ngôn ngữ lập trình tựa ALGOL/Pascal, như C. Một toán tử bao giờ cũng trông đợi các toán hạng số hay xâu (hay có thể là tổ hợp của cả hai). Nếu bạn cung cấp một toán hạng xâu ở chỗ đang cần tới một số, hay ngược lại, thì Perl sẽ tự động chuyển toán hạng đó bằng việc dùng các qui tắc khá trực giác, mà sẽ được nêu chi tiết trong mục "Chuyển đổi giữa số và xâu" dưới đây. 2.4.1 Toán tử cho số Perl cung cấp các toán tử cộng, trừ, nhân, chia điển hình thông thường. Chẳng hạn: 2 + 3 # 2 cộng 3, = 5 5.1 - 2.4 # 5.1 trừ 2.4, = 2.7 3 * 12 # 3 lần 12, = 36 14 / 2 # 14 chia cho 2, = 7 10.2 / 0.3 # 10.2 chia cho 0.3, = 34 10 / 3 # 10 chia cho 3, bao giờ cũng là phép chia dấu phẩy động, nên = 3.333 Bên cạnh đó, Perl cung cấp toán tử lũy thừa kiểu FORTRAN, mà nhiều người đã từng mong mỏi cho Pascal và C. Toán tử này được biểu diễn bằng hai dấu sao, như 2**3 = 2 3 = 8. (nếu kết quả không thể khớp trong số dấu phẩy động độ chính xác gấp đôi, như một số âm mà lại luỹ thừa theo số không nguyên, hay một số lớn lấy luỹ thừa theo số lớn, thì bạn sẽ nhận được lỗi 'định mệnh' - fatal error). Perl cũng hỗ trợ cho toán tử lấy đồng dư mô-đun như trong C. Giá trị của biểu thức 10 % 3 là số dư khi lấy 10 chia cho 3, chính là 1. Cả hai giá trị trước khi tính toán đều được đưa về giá trị nguyên, cho nên 10.5 % 3.2 được tính là 10 % 3. Các toán tử so sánh logic là hệt như các toán tử có trong C (< <= == >= > !=), và việc so sánh hai giá trị về mặt số sẽ cho lại một giá trị đúng (True) hay sai (False). Chẳng hạn, 3 > 2 trả về True vì 3 lớn hơn 2, trong khi 5 != 5 trả về False. Các định nghĩa về đúng và sai được nói tới về sau, nhưng với hiện tại, các bạn hãy nghĩ về giá trị cho lại giống như chúng ở trong C - 1 là True, còn 0 là False. (các toán tử này sẽ được nói lại trong Bảng 2-2). 2.4.2 Toán tử xâu Các giá trị xâu có thể được ghép với toán tử chấm (.) (đó là dấu chấm đơn). Điều này không làm thay đổi xâu, cũng như 2+3 không làm thay đổi 2 hay 3. Nhưng kết quả trả về là một xâu ghép (theo thứ tự) của 2 xâu thành phần, vậy là có sẵn cho tính toán thêm hay được cất giữ trong một biến: "hello" . "world" # tương tự như "helloworld" 'hello wordl' . "\n" # hệt như "hello world\n" "jerry" . " " . "tom" # hệt như "jerry tom" Chú ý rằng việc ghép nối phải được gọi tường minh tới toán tử ., không giống awk là bạn đơn thuần chỉ việc đặt hai xâu gần nhau. Một tập các toán tử cho xâu khác là toán tử so sánh xâu. Các toán tử này đều tựa FORTRAN, như lt thay cho bé hơn Các toán tử so sánh các giá trị ASCII của các kí tự của xâu theo cách thông thường. Tập đầy đủ các toán tử so sánh (cho cả số và xâu) được nêu trong Bảng 2-2. Bảng 2-2. Các toán tử so sánh số và xâu Phép so sánh Số Xâu Bằng == eq Không bằng != ne Bé hơn < lt Lớn hơn > gt Bé hơn hay bằng <= le Lớn hơn hay bằng >= ge Bạn có thể tự hỏi tại sao lại có các toán tử phân tách cho số và xâu vậy, nếu số và xâu được tự động chuyển đổi lẫn cho nhau? Ta hãy xét hai giá trị 7 và 30. Nếu được so sánh như số thì 7 hiển nhiên bé hơn 30, nhưng nếu được so sánh theo xâu, thì xâu "30" sẽ đứng trước xâu "7" (vì giá trị ASCII của 3 thì bé hơn giá trị ASCII của 7), và do đó là bé hơn. Cho nên, không giống awk, Perl đòi hỏi bạn xác định đúng kiểu so sánh, liệu đó là số hay xâu. Chú ý rằng các phép so sánh số và xâu về đại thể ngược với những điều xẩy ra cho chỉ lệnh test của UNIX, mà thường dùng kí hiệu -eq để so sánh số còn = để so sánh xâu. Vẫn còn một toán tử xâu khác là toán tử lặp lại xâu, bao gồm một kí tự chữ thường đơn giản x. Toán tử này lấy toán hạng trái của nó (một xâu), và thực hiện nhiều việc ghép bản sao của xâu đó theo số lần do toán hạng bên phải chỉ ra (một số). Chẳng hạn: "jerry" x 3 # là "jerryjerryjerry" "tom" x (4+1) # là "tom" x 5 hay "tomtomtomtomtom" (3+2) x 4 # là 5 x 4, hay thực sự là "5" x 4, là "5555" Nhưng toán tử lặp lại xâu cần một xâu cho toán hạng bên trái, cho nên số 5 được chuyển thành xâu "5" (dùng các qui tắc sẽ được mô tả chi tiết về sau), thành xâu một kí tự. Xâu mới này rồi được sao lên bốn lần, cho xâu bốn kí tự 5555. Chú ý rằng nếu ta đảo ngược trật tự các toán hạng, thì ta sẽ làm năm bản sao của xâu 4, cho 44444. Điều này chỉ ra rằng việc lặp lại xâu là không giao hoán. Số đếm bản sao (toán hạng bên phải) trước hết sẽ bị chặt đi để cho giá trị nguyên (4.8 trở thành 4) trước khi được sử dụng. Số đếm bản sao bé hơn một sẽ gây ra kết quả là xâu rỗng (chiều dài không). 2.4.3 Thứ tự ưu tiên và luật kết hợp của toán tử Thứ tự ưu tiên của toán tử xác định ra cách giải quyết trường hợp không rõ ràng khi nào dùng toán tử nào trên ba toán hạng. Chẳng hạn, trong biểu thức 2+3*4, ta sẽ thực hiện phép cộng trước hay phép nhân trước? Nếu ta làm phép cộng trước thì ta sẽ được 5*4, hay 20. Nhưng nếu ta làm phép nhân trước (như ta vẫn được dạ trong toán) thì ta được 2+12, hay 14. Perl chọn định nghĩa toán học thông thường, thực hiện nhân trước. Bởi điều này, ta nói nhân có số ưu tiên cao hơn cộng. Bạn có thể phá đi trật tự theo số ưu tiên bằng việc dùng dấu ngoặc. Cho nên nếu tôi thực sự muốn cộng trước khi nhân, thì tôi có thể viết (2+3)*4, cho 20. Cũng vậy, nếu tôi muốn biểu thị rằng phép nhân được thực hiện trước phép cộng, tôi có thể trang điểm thêm, nhưng chẳng để làm gì, một cặp dấu ngoặc trong 2+(3*4). Trong khi số ưu tiên là trực giác cho phép cộng và nhân thì ta bắt đầu lao vào vấn đề thường hay phải đương đầu với, chẳng hạn, phân biệt thế nào đối với phép ghép xâu và nâng lên luỹ thừa. Cách đúng đắn để giải quyết điều này là tra cứu sơ đồ số thứ tự ưu tiên toán tử của Perl, được nêu trong Bảng 2- 3 (chú ý rằng một số các toán tử còn chưa được mô tả). Với những toán tử cũng có trong C, thì những toán tử đó có cùng số thứ tự ưu tiên như chúng có trong C (mà tôi chẳng bao giờ có thể nhớ được). Bảng 2-3: Luật kết hợp và số ưu tiên của các toán tử (thấp nhất đến cao nhất) Luật kết hợp Toán tử Trái các toán tử về "danh sách" (mảng) Trái > (gọi hàm) - (không xét) ++ (tăng 1) hoặc (giảm 1) Phải ** (luỹ thừa) Phải ! ~ \ + - (phủ định lôgic, phủ định bit, tham khảo biến (như pointer trong C), số dương, số âm) Trái =~ !~ (sánh, không sánh) Trái * / % x (nhân, chia, đồng dư, lặp chuỗi) Trái + - . (cộng, trừ, ghép xâu) Trái << >> (dịch chuyển bit) - các toán tử 1 toán hạng (như chomp) - < > <= >= lt gt le ge - == != <=> eq ne cmp Trái & (phép lôgíc 'and' theo bit) Trái | ^ (phép lôgíc 'or', 'xor' theo bit) Trái && (phép lôgíc 'and') Left || (phép lôgíc 'or') - (toán tử phạm vi), (cấu tử danh sách) Phải ?: (if-then-else, như trong C) Phải = += -+ += (các phép gán) Trái , => (ngăn cách bằng , và bằng =>) - các toán tử về danh sách (array) Phải not (phép lôgíc 'not') Trái and (phép lôgíc 'and') Trái or xor (phép lôgíc 'or', 'xor') Trong sơ đồ này, bất kì toán tử đã cho nào đều có số ưu tiên lớn hơn các toán tử được liệt kê trên nó, và có số ưu tiên thấp hơn các toán tử được liệt kê dưới nó. Các toán tử tại cùng mức ưu tiên được giải quyết theo luật kết hợp. Giống như với số ưu tiên, luật kết hợp giải quyết trật tự của các phép toán khi hai toán tử có cùng mức ưu tiên cùng tác động trên ba toán hạng: 2 ** 3 ** 4 # 2 ** (3 ** 4), hay 2 ** 81, hay xấp xỉ 2.41e24 72 / 12 / 3 # (72 / 12) / 3, hay 6 / 3, hay 2 30 / 6 * 3 # (30/6)*3, hay 15 . 1 »» Chương 3 Learning Perl - Chương 2: Dữ liệu vô hướng 1. Dữ liệu vô hướng là gì? 2. Số 3. Xâu 4. Toán tử 5. Biến vô hướng 6. Các phép toán trên biến vô hướng 7. <STDIN> xem như một vô. hạn: 1. 25 # một và 1 / 4 7.25e45 # 7,25 x 10 45 (một số dương lớn) -6 .5e24 # -6 ,5 x 10 24 (một số âm lớn) -1 2e-24 # -1 2 x 10 -2 4 (một số âm rất nhỏ) -1 .2E-23 # tương tự như số ở trên: -1 ,2. <STDIN> xem như một vô hướng 8. Đưa ra bằng print() 9. Giá trị undef 10 . Bài tập 2 .1 Dữ liệu vô hướng là gì? Vô hướng là loại dữ liệu đơn giản nhất mà Perl thao tác. Một vô hướng thì hoặc là một

Ngày đăng: 26/07/2014, 12:20

Xem thêm: Learning Perl - Dữ liệu vô hướng part 1 ppt

TỪ KHÓA LIÊN QUAN

w