Tải bản đầy đủ (.doc) (12 trang)

Ngôn ngữ Perl-Chương 02-Dữ liệu vô hướng

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (204.37 KB, 12 trang )

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

×