Nhócyêu_ufa lượm lặt gần xa
2
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 1025). 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ó 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, 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 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** 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(). .
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.
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, nhưng 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. 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ò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, 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 - 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, 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: “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.) 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ì
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. Nhưng 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 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á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 chưa đượ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, nhưng 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)** 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 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,
nhưng 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.
_________________
.................................................................................. nhocyeu_ufa ..................................................................................
album1 - hình chụp với Ubuntualbum2 - ảnh cá nhân & bên ngoài
|
0 nhận xét:
Đăng nhận xét