Tải bản đầy đủ (.docx) (15 trang)

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 (142.65 KB, 15 trang )

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ố (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).

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×