Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 15 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
15
Dung lượng
58,66 KB
Nội dung
Dữliệuvô hớng Dữliệuvô 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 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, Perl dùng chúng gần nh đổi lẫn cho nhau, cho nên tôi sẽ mô tả chúng với nhau. Một giá trị vô hớng có thể đợc tác động tới qua các toán tử (giống nh phép cộng hay ghép tiếp), nói chung cho lại 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 vô hớng có thể đợc đọc từ tệp và thiết bị, và đợc ghi ra nữa. Số Mặc dầu vô hớng thì hoặc là một số hay một xâu, điều cũng có ích là nhìn vào các số và xâu tách biệt nhau trong một chốc. ta sẽ xét số trớc rồi đến xâu . 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ấuchấm thập phân, nh 3.14, hay 1.35 lần 10 25 ). Nhng 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), nhng 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ó tẹo nào. 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, nhng 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ự, nhng 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 phần t 7.25e45 # 7.25 lần 10 mũ 45 (một số lớn) -6.5e24 # âm 6.5 lần 10 mũ 24 (một số âm lớn) -12e-24 # âm 12 lần 10 mũ -24 (một số âm rất nhỏ) -1.2E-23 # một cách khác để nói điều đó. Hằng kí hiệu nguyên Các hằng kí hiêu jnguyên cũng là trực tiếp, nh trong: 12 15 -2004 3485 Bạn đừng bắt đầu một số bằng 0, vì Perl hỗ trợ cho hằng kí hiệu hệ 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 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, giống nh 255 thập phân -0xff # FF hệ mời sáu âm, hệt nh -255 thập phân Xâu Xâu là các dẫy kí tự (nh Xin chào). Mỗi kí tự đều là một giá trị 8-bit trong toàn bộ tâkp 256 kí tự (không có gì đặc biệt về kí tự NUL nh trong C). Xâu ngắn nhất có thể đợc thì không có kí tự nào. Xâu dài nhất thì chiếm trọn bộ nhớ của bạn (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 hạn sẵn gì mà Perl cho phép mọi cơ hội. Các xâu điển hình là các dẫy in đợc gồm các chữ và 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á víu lõi UNIX bằng việc đọc nó vào trong xâu Perl, tiến hành thay đổi, và ghi kết quả lại.) Giống nh số, xâu có 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 vị: xâu dấu nháy đơn và xâu dấu nháy kép. * * Chỉ báo số không đứng đầu chỉ có tác dụng với các hằng kí hiệu - không có tác dụng cho việc chuyển đổi tự động xâu sang số. bạn có thể chuyển đổi một xâu dữliệu giống nh một giá trị hệ tám và hệ mời sáu thành một số với oct() hay hex(). 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 dòng mới, 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 biệt 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. Dới dạng hình ảnh: 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 không (không 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, dòng mới, there (toàn bộ 11 kí tự) Chú ý rằng \n bên trong môt jxâu có nháy đơn thì không đợc hiểu là dòng mới, nhng là hai kí tự sổ chéo ngợc và n. (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.) 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. Nhng 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òng mới 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 Lối thoát sổ chéo ngợc xâu nháy kép Kết cấu ý nghĩa \n dòng mới \r quay lại \t Tab \f kéo giấy \b Backspace \v tab chiều đứng \a chuông \e lối thoát \007 bất kì giá trị ASCII hệ tám (ở đây, 007 = chuông) \x7f giá trị ASCII hệ mời sáu (ở đây, 7f = xoá) \cC bất kì kí tự điều khiển nào (ở đây, control C) \\ sổ chéo ngợc \ dấu nháy kép \l chữ tiếp là chữ thờng \L tất cả các chữ đi sau cho tới \E đều là chữ thờng \u Chữ tiếp là chữ hoa \U tất cả các chữ đi sau cho tới \E đều là 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 cuộc đi dạo), cho nên tôi sẽ quay lại vấn đề này sau. 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 nsoi 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. 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, vân vân. Chẳng hạn: 2 + 3 # 2 cộng 3, hay 5 5.1 - 2.4 # 5.1 trừ đi 2.4, hay 2.7 3 * 12 # 3 lần 12 = 36 14 / 2 # 14 chia cho 2, hay 7 10.2 / 0.3 # 10.2 chia cho 0.3, hay 34 10 / 3 # bao giờ 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, chính là hai luỹ thừa ba, hay tám. (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.) Perl cũng hỗ trợ cho toán tử lấy đồng d modulus, nh trong C. Giá trị của biểu thức 10 % 3 là số d khi lấy mời chia cho ba, chính là một. Cả hai giá trị đều trớc hết đợ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 hay sai. Chẳng hạn, 3 . 2 cho lại đúng vì ba lớn hơn hai, trong khi 5 != 5 cho lại sai vì không đúng là năm lại không bằng năm. Các định nghĩa về đúng và sai đợc nói tới về sau, nhng 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 - một là đúng, còn không là sai. (Các toán tử này sẽ đwojc thăm lại trong Bảng 2-2.) Toán tử xâu Các giá trị xâu có thể đợc ghép với toán tử chấm (.). (Quả thế, đó 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. Xâu kết quả (dài hơ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 # hệt nh helloworld hello wordl . \n # hệt nh hello world\n fred . . barney # hệt nh fred barney 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 mà bạn đơn thuần phải đánh dấu hai giá trị gần lẫ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, vân vâ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, nhng 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: fred x 3 # là fredfredfred barney x (4+1) # là barney x 5 hay # barneybarneybarneybarneybarney (3+2) x 4 # là 5 x 4, hay thực sự 5 x 4, là 5555 Thí dụ cuối cùng đáng để xem xét chậm rãi. Các dấu ngoặc trên (3+2) buộc cho phàn này của biểu thức cần phải đợc tính trớc, cho năm. (Các dấu ngoặc ở đây làm việc giống nh trong C, hay trong toán học chuẩn.) Nhng 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ì tssa 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 cụ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). 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. Nhng nếu ta làm phép nhân trớc (nh ta vẫn đợc dậy trong giờ toán) thì ta đợc 2+12, hay 14. May mắn là Perl chọn định nghĩa toán học thông thờng, thực hiện nhân trớc. Bởi ffiều này, ta nói nhân có số u tiên cao hơn cộng. Bạn có thể phá rào trật tự theo số u tiên bằng việc dùng dấu ngoặc. Bất kì cái gì trong dấu ngoặc đều đợc tính hết trớc khi toán tử bên ngoài dấu ngoặc đợc áp dụng (hệt nh bạn đã học trong giờ toán). 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 nhng 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ác đú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 cha đợc mô tả, và trong thực tế, thậm chí không thể xuất hiện ở bất kì đâu trong cuốn sách này, nhng chớ có làm điều đó làm bạn hoảng sợ về việc đọc chúng.) Với những toán tử cũng có trong C, thì những toán tử đó có cùng sóo thứ tự u tiên nh chúng có trong C (mà tôi có thể chẳng bao giờ 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ử không Toán tử danh sách trái , (phẩy) phải += và các toán tử khác (toán tử gán) phải ? : (toán tử if/then/else ba ngôi) không (toán tử phạm vi, cấu tử danh sách) trái || (hoặc logic) trái && (và logic) trái | ^ (hoặc bit, hoặc bit loại trừ) trái & (và bit) không == != <=> eq ne cmp (toán tử bằng) không < <= > >= lt le gt ge (toán tử không bằng) không Toán tử một ngôi có tên không -r và (các toán tử kiểm tra tệp) * khác trái << >> (dịch chuyển bit) trái + - . (cộng, trừ, ghép xâu) trái * / % x (nhân, chia, lấy d, lặp xâu) trái =~ !~ (sánh, không sánh) phải ** (luỹ thừa) phải ! ~ - (phủ định logic, phủ định bit, phủ định số) không ++ -- (tự tăng, tự giảm) 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ó. (Điều này dựng ngợc lại điều có lẽ bạn đang trông đợi, nhng nó hệt nh trong sách con lừa, và chúng tôi cũng đã dựng ngợc nó xuống ở đó nữa.) 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 Trong trờng hợp thứ nhất, toán tử ** có luật kết hợp phải, cho nên các dấu ngoặc đợc áp dụng từ bên phải. So sánh với nó, các toán tử * và / có luật kết hợp trái, cho tập các dấu ngoặc bên trái. Chuyển đổi giữa số và xâu Nếu một giá trị xâu đợc dùng nh một toán hạng cho một toán tử số (chẳng hạn, +), thì Perl sẽ tự động chuyển xâu thành giá trị số tơng đơng, dờng nh nó đã đợc đa * * Perl 5.0 tổ hợp các toán tử kiểm tra tệp và toán tử một ngôi có tên vào cùng mức số u tiên vào nh một giá trị dấu phẩy động * . Những chất liệu phi số đằng đuôi và khoảng trắng đằng đầu đều bị bỏ qua một cách yên lặng và lễ phép, cho nên 123.45fred (với dấu cách đứng trớc) chuyển thành 123.45 với lời cảnh báo * . Tại một cực điểm của điều này, một cái gì đó không phải là số tẹo nào chuyển thành không mà không có báo trớc (nh xâu fred đợc dùng nh số). Giống vậy, nếu một giá trị số đợc cho khi đang cần tới một giá trị xâu (cho phép ghép xâu chẳng hạn), thì giá trị số sẽ đợc mở rộng thành bất kì xâu nào sẽ đợc in ra cho số đó. Chẳng hạn, nếu bạn muốn ghép nối X và theo sau là kết quả của 4 nhân với 5 thì bạn có thể làm đơn giản là: X.(4*5) # hệt nh X .20, hay X20 (Nhớ rằng các dấu ngoặc này buộc 4*5 phải đợc tính trớc khi xem xét toán tử ghép nối xâu.) Nói cách khác, bạn không thực sự phải lo lắng gì về liệu bạn có một số hay một xâu (phần lớn thời gian). Perl thực hiện mọi chuyển đổi cho bạn. Biến vô hớng Một biến là một tên gọi cho một chỗ chứa giữ đợc một hay nhiều giá trị. Tên của biến là không đổi trong toàn bộ chơng trình, nhng giá trị hay các giá trị đợc chứa trong biến đó về cơ bản thì lại thay đổi đi thay đổi lại trong suốt sự thực hiện chơng trình. Một biến vô hớng thì giữ một giá trị vô hớng riêng (biểu thị cho một số, hay một xâu, hay cả hai). Các tên biến vô hớng bắt đầu với dấu đô la và tiếp theo sau là một chữ, rồi thì có thể là nhiều chữ, số hay dấu gạch thấp. Chữ hoa và chữ thờng là phân biệt: biến $A là khác biến $a. Và tất cả các chữ, số và gạch thấp đều có nghĩa, cho nên: $a_very_long_variable_that_ends_in_1 là khác với $a_very_long_variable_that_ends_in_2 Bạn nói chung nên chọn tên biến mang một nghĩa nào đó có liên quan tới giá trị của biến đó. Chẳng hạn, $xyz123 có lẽ không mang tính mô tả nhiều lắm nhng $line_length thì lại có nghĩa. Các toán tử trên biến vô hớng Phép toán thông dụng nhất trên biến vô hớng là phép gán, chính là cách đặt một giá trị cho một biến. Toán tử gán của Perl là dấu bằng (giống nh C hay FORTRAN), * * Các giá trị hệ tám và hệ mời sáu không đợc hỗ trợ trong chuyển đổi tự động này. Bạn hãy dùng hex() và oct() để diễn giải các giá trị hệ mời sáu và tám. * * Trừ phi bạn bật tuỳ chọn -w trên dòng lệnh để tên biến bên vế trái và cho giá trị của biểu thức bên vế phải, kiểu nh: $a = 17; # cho $a giá trị 17 $b = $a + 3; # cho $b giá trị hiện tại của $a cộng với 3 (20) $b = $b * 2; # cho $b giá trị của $b đợc nhân với 2 (40) Chú ý rằng dòng cuối dùng biến $b hai lần: khi lấy đợc giá trị của nó (ở vế phải dấu =), và khi xác định xem phải đặt biểu thức tính đợc vào đâu (ở vế trái của dấu =). Điều này là hợp lệ, an toàn và trong thực tế, khá thông dụng. Trong thực tế, nó thông dụng đến mức chúng ta sẽ thấy trong vài phút đây là ta có thể viết điều này bằng việc dùng cách viết tắt qui ớc. Bạn có thể đã chú ý rằng các biến vô hớng bao giờ cũng đợc tham khảo bằng dấu $ đứng trớc. Trong lớp vỏ, bạn dùng $ để lấy một giá trị, nhng để $ đứng một mình để gán một giá trị mới. Trong awk hay C, bạn để cho $ riêng hoàn toàn. Nếu bạn cứ phải viết đi viết lại các biến rất nhiều thì bạn sẽ thấy mình ngẫu nhiên bị gõ sai. Thờng hay bị vậy. (Giải pháp của tôi là chấm dứt việc viết chơng trình vỏ, awk và C, nhng điều đó lại có thể không có tác dụng cho bạn.) Việc gán vô hớng có thể đợc dùng nh một giá trị cũng nh một phép toán, nh trong C. Nói cách khác, $a = 3 có một giá trị, cũng nh $a+3 có một giá trị. Giá trị chính là số đợc gán, cho nên giá trị của $a = 3 là 3. Mặc dầu điều này dờng nh có vẻ kì lạ lúc thoáng nhìn, việc dùng một phép gán nh một giá trị lại có ích nếu bạn muốn gán một giá trị trung gian trong một biểu thức cho một biến, hay nếu bạn muốn đơn giản sao cùng một giá trị cho một hay nhiều biến. Chẳng hạn: $b = 4 + ($a = 3); # gán 3 cho $a, rồi cộng kết quả đó với 4 đặt vào $b, đợc 7 $d = ($c = 5); # sao 5 vào $c, và rồi sao vào $d $d = $c = 5; # cũng điều ấy nhng không có dấu ngoặc Thí dụ cuối làm việc tốt vì phép gán có tính kết hợp bên phải. Toán tử gán hai ngôi Các biểu thức nh $a = $a + 5 (trong đó cùng một biến lại xuất hiện ở cả hai vế của phép gán) thờng xuất hiện đến mức Perl (giống nh C) có cách viết tắt cho phép toán làm thay đổi biến - toán tử gán hai ngôi. Gần nh tất cả các toán tử hai ngôi tính một giá trị đều có dạng phép gán hai ngôi tơng ứng với dấu bằng có bổ sung thêm phần tử. Chẳng hạn, hai dòng sau đây là tơng đơng: $a = $a + 5 ; # không có toán tử gán hai ngôi $a += 5 ; # có toán tử gán hai ngôi Và tơng tự nh thế: $b = $b * 3; $b *= 3; [...]... này nhận một đối bên trong các dấu ngoặc của nó - tên của một biến vô hớng - và bỏ đi kí tự cuối cùng từ giá trị xâu của biến đó Chẳng hạn: $x = Xin chào mọi ngời; chop($x); # $x bây giờ là Xin chào mọi ngờ Lu ý rằng giá trị của đối bị thay đổi ở đây, do đó cần phải có một biến vô hớng, thay vì chỉ đơn giản là giá trị vô hớng Sẽ là vô nghĩa, chẳng hạn, để viết chop(suey) để biến nó thành sue, vì không... cho lại một xâu của dòng tiếp vừa đợc đọc, tuy nhiên (nh khi bạn gõ control-D tại thiết bị cuối, hay khi một tệp không còn dữ liệu nữa), thì toán tử này cho lại undef nh một giá trị Chúng ta sẽ thấy trong chơng 6 cách kiểm tả điều này và chọn hành động đặc biệt khi không còn dữ liệu nào có sẵn để đọc nữa Bài tập Xem Phụ lục A về lời giải 1 Hãy viết một chơng trình tính chu vi đờng tròn với bán kính... lẫn nháy kép, vì các xâu có nháy kép là chủ đề cho việc xen lẫn biến xem nh một vô hớng Tại điểm này, nếu bạn là một ngời chuyên nghiệp lập trình thì bạn có thể tự hỏi làm sao lấy đợc một giá trị vào trong chơng trình Perl Sau đây là cách đơn giản nhất Mỗi lần bạn dùng ở chỗ đang trông đợi một giá trị vô hớng, thì Perl sẽ đọc toàn bộ dòng văn bản tiếp từ lối vào chuẩn (cho tới dấu dòng... nếu bạn dùng một biến vô hớng trớc khi bạn cho nó một giá trị? Chẳng có gì nghiêm trọng cả, và chẳng có gì dứt khoát sẽ gây định mệnh cả Các biến đều có giá trị undef trớc khi chúng đợc gán lần đầu tiên Giá trị này trông nh số không khi đợc dùng nh một số, hay xâu rỗng chiều dài không nếu đợc dùng nh một xâu Nhiều toán tử cho lại undef khi các đối vợt ra ngoài phạm vi và thành vô nghĩa Nếu bạn không... phải lo lắng gì về phần riềm bên Bạn quyết định xem mình sẽ theo vào phía nào Xen lẫn vô hớng vào trong xâu Khi một hằng kí tự xâu là đợc đặt trong nháy kép thì nó là chủ đề cho việc xen lẫn biến (bên cạnh việc đợc kiểm tra cho lối thoát sổ chéo ngợc) Điều này có nghĩa là xâu này đợc duyệt qua để tìm các tên biến* vô hớng có thể - có nghĩa là dấu đô la đi theo sau một chữ, số hay dấu gạch thấp Khi tìm... hành động tham khảo tới biến đó ở bên trái của dấu bằng.) Đa ra bằng print() Vậy ta thu đợc mọi thứ với Ta làm sao đa ra mọi thứ đây? Bằng toán tử print() đấy Toán tử tiền tố này nhận một giá trị vô hớng bên trong các dấu ngoặc của nó và đa ra mà không cần bất kì sự trang điểm nào lên lối ra chuẩn Một lần nữa, chừng nào bạn còn cha làm điều gì kì lạ, thì lối ra này vẫn cứ là thiết bị cuối của bạn... các tên biến* vô hớng có thể - có nghĩa là dấu đô la đi theo sau một chữ, số hay dấu gạch thấp Khi tìm thấy một tham khảo biến thì nó đợc thay thế bằng giá trị hiện tại (hay bất kì xâu rỗng nào nếu biến vô hớng còn cha đợc gán giá trị nào) Chẳng hạn: $a = fred; $b = some text $a; # $b bây giờ là some text fred $c = no such variable $what; # $c là no such variable Để ngăn cản việc thay thế một biến bằng... quả của biểu thức này là giá trị của biến trớc khi biến đợc tăng lên Chẳng hạn, $c = 17; $d = $c++; # $d là 17, nhng $c bây giờ là 18 Vì giá trị của toán hạng thay đổi nên toán hạng này phải là một biến vô hớng, không phải là biểu thức Bạn không thể nói ++16 để có đợc 17, mà cũng không thể nói ++($a+$b) là cách nào đó để có đợc giá trị lớn hơn tổng của $a và $b một đơn vị Toán tử tự giảm ( ) cũng tơng . Dữ liệu vô hớng 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ố. 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