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

Định dạ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 (87.16 KB, 13 trang )

Định dạng
Định dạng là gì?
Trong số nhiều việc làm đợc, Perl thờng đợc dùng làm ngôn ngữ trích rút và báo
cáo thực hành. Đây là lúc biết về việc ngôn ngữ báo cáo đó.
Perl cung cấp một khái niệm về tiêu bản viết báo cáo đơn giản, đợc gọi là định
dạng. Định dạng xác định ra phần không đổi (tiêu đề cột, nhãn, văn bản cố định hay
bất kì cái gì) và phần biến đổi (dữ liệu hiện tại mà bạn báo cáo). Hình dạng của định
dạng thì rất gần với hình dạng của cái ra, tơng tự nh cái ra đã đợc định dạng trong
COBL hay mệnh đề print using của một số ngôn ngữ BASIC.
Việc dùng định dạng bao gồm ba điều sau:
1. Định nghĩa định dạng
2. Nạp dữ liệu cần in vào phần biến đổi của định dạng (trờng)
3. gọi tới định dạng
Thờng thì bớc thứ nhất đợc thực hiện ngay (trong văn bản chơng trình sao cho nó
đợc xác định vào lúc dịch), và hai bớc sau đợc thực hiện lặp đi lặp lại.
Định nghĩa một định dạng
Định dạng đợc định nghĩa bằng việc dùng định nghĩa định dạng. Định nghĩa định
dạng này có thể xuất hiện ở bất kì đâu trong văn bản chơng trình của bạn, giống nh
chơng trình con. Định nghĩa định dạng trông tựa nh thế này:
format tênđịnhdạng =
dòngtrờng
giá_trị_một, giá _trị_hai, giá _trị_ba
dòngtrờng
giá_trị_một, giá _trị_hai, giá _trị_ba
dòngtrờng
giá_trị_một, giá _trị_hai, giá _trị_ba
.
Dòng thứ nhất có chứa từ dành riêng format, tiếp đó là tên định dạng và rồi đến
dấu bằng (=). Tên định dạng đợc chọn từ một không gian tên khác, và tuân theo cùng
qui tắc nh mọi thứ khác. Vì tên định dạng không bao giờ đợc dùng bên trong thân ch-
ơng trình (ngoại trừ bên trong giá trị xâu), nên bạn có thể an toàn dùng các tên trùng


với với các từ dàng riêng. Nh bạn sẽ thấy trong mục sau, Gọi định dạng, phần lớn
các tên định dạng của bạn có lẽ sẽ là một nh tên tớc hiệu tệp (mà thế thì làm cho
chúng không phải là một nh các từ dành riêng)
Tiếp theo sau dòng thứ nhất là bản thân tiêu bản, mở rộng từ không đến nhiều
dòng văn bản. Phần cuối của tiêu bản đợc chỉ ra bằng một dấu chấm. Tiêu bản là
nhậy cảm với khoảng trắng - đây là một trong vài chỗ mà một số khoảng trắng (dấu
cách, xuống dòng, hay tab) gây ra vấn đề trong văn bản chơng trình Perl.
Định nghĩa tiêu bản có chứa một chuỗi các dòng trờng. Mỗi dòng trờng có thể
chứa văn bản cố định - văn bản sẽ đợc in ra theo từng kí tự khi định dạng này đợc gọi
tới. Sau đây là một thí dụ về dòng trờng có văn bản cố định:
Hello, my name is Fred Flintstone.
Tên trờng có thể chứa cả nơi giữ trờng cho văn bản biến đổi. Nếu một dòng có
chứa nơi giữ trờng, thì dòng tiếp sau của tiêu bản (đợc gọi là dòng giá trị) sẽ mô tả
cho một loạt các giá trị vô hớng - mỗi giá trị ứng với một nơi giữ trờng - mà cung cấp
ra giá trị sẽ đợc gắn vào trong trờng. Sau đây là một thí dụ về dòng trờng với một nơi
giữ trờng, và dòng giá trị đi theo:
Hello, my name is @<<<<<<<<<<<.
$name
Nơi giữ trờng là @<<<<<<<<<<<, sẽ xác định ra trờng văn bản đợc dồn trái bởi
11 kí tự. Các chi tiết đầy đủ hơn về nơi giữ trờng sẽ đợc nêu trong mục có tên Nói
thêm về nơi giữ trờng dới đây.
Nếu dòng trờng có nhiều nơi giữ trờng, thì nó cần nhiều giá trị, cho nên các giá
trị đợc tách nhau bởi dấu phẩy:
Hello, my name is @<<<<<<<<<<< and Im @<< years old..
$name, $age
Gắn tất cả những điều này lại chúng ta có thể tạo ra một định dạng đơn giản cho
một nhãn địa chỉ:
format ADDRESSLABEL =
========================
| @<<<<<<<<<<<<<<<<<<<< |

$name
| @<<<<<<<<<<<<<<<<<<<< |
$address
| @<<<<<<<<<<<, @< @<<<< |
$city, $state, $zip
========================
.
Lu ý rằng các dòng có dấu bằng trên đỉnh và dới đáy của định dạng không có tr-
ờng, và do vậy không có dòng giá trị theo sau. (Nếu bạn đặt một dòng giá trị đi theo
sau dòng trờng nhu vậy, nó sẽ đợc diễn giải nh một dòng trờng khác, có thể không
làm điều bạn muốn.)
Khoảng trắng bên trong dòng giá trị bị bỏ qua. Một số ngời chọn việc dùng
khoảng trống phụ trong dòng giá trị để nối dòng biến với nơi giữ trờng trên dòng trớc
đó (nh đặt $zip ở dới trờng thứ ba của dòng trớc đó trong thí dụ này), nhng thế chỉ để
mà trông thôi. Perl không quan tâm tới điều đó, và nó không ảnh hởng tới cái ra của
bạn.
Các giá trị đợc tính toán cho các giá trị vô hớng của chúng, cho nên tất cả các
biểu thức đều đợc diễn giải theo ngữ cảnh vô hớng
*
. Văn bản theo sau dấu xuống
dòng thứ nhất trong một giá trị bị bỏ qua (ngoại trừ trong trờng hợp đặc biệt nhiều nơi
giữ trờng, sẽ đợc mô tả về sau).
Định nghĩa định dạng cũng giống nh định nghĩa chơng trình con. Nó không chứa
chơng trình thực hiện ngay lập tức, và do đó có thể đợc đặt ở bất kì đâu trong tệp với
phần còn lại của chơng trình - tôi có khuynh hớng đặt những định dạng của mình vào
cuối tệp, trớc các định nghĩa chơng trình con.
Gọi một định dạng
Bạn gọi tới một định dạng bằng toán tử write. Toán tử này lấy tên của tớc hiệu
tệp, và sinh ra văn bản cho tớc hiệu tệp đó bằng việc dùng định dạng hiện thời cho tớc
hiệu tệp đó. Theo ngầm định, định dạng hiện thời cho một tớc hiệu tệp là định dạng

với cùng tên (cho nên với tớc hiệu tệp STDOUT, định dạng STDOUT sẽ đợc dùng),
nhng chúng ta sẽ thấy ngay rằng bạn có thể thay đổi nó.
Ta hãy lấy một thí dụ khác bằng việc xét định dạng nhãn địa chỉ, và tạo ra một tệp
chứa các nãhn địa chỉ. Sau đây là một đoạn chơng trình:
format ADDRESSLABEL =
========================
| @<<<<<<<<<<<<<<<<<<<< |
$name
| @<<<<<<<<<<<<<<<<<<<< |
$address
| @<<<<<<<<<<<, @< @<<<< |
$city, $state, $zip
========================
.
open (ADDRESSLABEL, >labels-to-print) || die cant create;
open (ADDRESSLABEL, addresses) || die can not open
addresses;
while ( <ADDRESSES> ) {
chop; # remove newline
($name, $address, $city, $state, $zip) = split (/:/) ;
*
*
Trong Perl 5.0, tôi đợc biết rằng toàn bộ dòng bây giờ đợc tính theo ngữ cảnh mảng, cho nên phát biểu này là
không đúng. Đáng phải nói khác đi nêu bạn có điều gì đó nh @a là một giá trị.
# load up the global variables
write ADDRESSLABEL; # send the output
}
Tại đây chúng ta thấy định nghĩa định dạng trớc, nhng bây giờ chúng ta cũng còn
có thêm cả chơng trình thực hiện nữa. Trớc hết, chúng ta mở một tớc hiệu tệp lên một
tệp ra đợc gọi là labels-to-print. Lu ý rằng tên tớc hiệu tệp (ADDRESSLABEL) là

cùng tên của định dạng. Điều này là quan trọng. Tiếp đó, ta mở tớc hiệu tệp trên danh
sách địa chỉ. Định dạng của danh sách địa chỉ đợc giả sử là một cái gì đó tựa nh:
Stonehenge:4470 SW Hall Suite 107: Beaverton:OR:97005
Fred Flintstone:3737 Hard Rock Lane:Bedrock:OZ:999bc
Nói cách khác, năm trờng tách biệt, mà chơng trìn hcủa ta sẽ phân tích nh mô tả
dới đây.
Chu trình while trong chơng trình này đọc từng dòng của tệp địa chỉ mỗi lúc, bỏ
đi dấu xuống dòng, rồi chẻ dòng này (không có dấu xuống dòng) vào năm biến. Lu ý
rằng các tên biến cũng là tên mà ta đã dùng khi định nghĩa định dạng. Điều này nữa
cũng là quan trọng.
Một khi ta có tất cả các biến đợc nạp vào (để cho các giá trị đợc định dạng sử
dụng là đúng đắn), thì toán tử write gọi tới định dạng này. L ý rằng tham biến cho
write là tớc hiệu tệp cần ghi ra và theo mặc định định dạng cho cùng tên cũng đợc
dùng.
Mỗi trờng trong định dạng đều đợc thay thế bởi một giá trị tơng ứng từ dòng tiếp
của định dạng. Sau khi hai bản ghi mẫu đợc nêu ở trên đã đợc xử lí, thì tệp labels-to-
print có chứa:
=====================
| Stonehege |
| 4470 SW Hall Suite 107 |
| Beaverton , OR 97005|
=====================
=====================
| Fred Flintstone |
| 3737 Hard Rock Lane |
| Bedrock , OZ 999bc |
=====================
Nói thêm về nơi giữ tệp
Cho đến giờ, qua thí dụ, bạn đã biết rằng nơi giữ trờng @<<<< có nghĩa là một
trờng đợc dồn trái với năm kí tự và rằng @<<<<<<<<<<< nghĩa là một trờng đợc

dồn trái với 11 kí tự. Sau đây là toàn bộ phạm vi, nh đã hứa trớc đây.
Trờng văn bản
Phần lớn những nơi giữ trờng đều bắt đầu bằng @. Các kí tự đi sau @ chỉ ra kiểu
của trờng, trong khi số các kí tự (kể cả @) chỉ ra chiều rộng của trờng.
Nếu các kí tự đi sau @ là dấu mở ngoặc góc trái (<<<<) thì bạn nhận đợc một tr-
ờng đợc dồn trái - tức là, giá trị sẽ đợc gắn thêm bên phải bằng dấu cách nếu giá trị
này ngắn hơn chiều rộng trờng. (Nếu một giá trị quá dài thì nó sẽ bị chặt cụt tự động -
dạng của định dạng bao giờ cũng đợc bảo tồn.)
Nếu các kí tự đi sau @ là dấu đóng ngoặc góc phải (>>>>) thì bạn nhận đợc một
trờng đợc dồn phải - tức là nếu giá trị quá ngắn, thì nó sẽ đợc bổ sung dấu cách vào
bên trái.
Cuối cùng, nếu các kí tự đi sau @ là dấu sổ đứng (| | | |) thì bạn nhận đợc một tr-
ờng định tâm: nếu giá trị quá ngắn thì nó đợc bổ sung thêm dấu cách vào cả hai bên,
đủ cho từng bên làm cho giá trị thành định tâm nhất bên trong trờng.
Trờng số
Một loại nơi giữ trờng khác là trờng số độ chính xác tĩnh, có ích cho những báo
cáo tài chính lớn. Trờng này cũng bắt đầu với @, và đợc theo sau bởi một hay nhiều
dấu # với một dấu chấm tuỳ chọn (chỉ ra dấu chấm thập phân). Một lần nữa, @ lại đ-
ợc đếm nh một trong các kí tự của trờng. Chẳng hạn:
format MONEY
Assets: @#####.## Liabilities: @#####.## Net: @#####.##
$assets, $liabilities, $assets-$liabilities
.
Ba trờng số cho phép sáu vị trí bên trái dấu chấm thập phân và hai vị trí bên phải
(có ích cho đô la Mĩ và phần xu). Bạn hãy lu ý tới việc dùng một biểu thức theo định
dạng - hoàn toàn hợp lệ và thờng hay đợc dùng.
Perl không đa ra điều gì cho ngời thành thạo khác hơn điều này: bạn không thể
nào lấy kí hiệu tiền trôi nổi hay dấu ngoặc nhọn quanh giá trị âm hay bất kì cái gì
khác. Để làm điều đó, bạn phải viết chơng trình con của riêng mình, kiểu nh:
format MONEYCOOL =

Assets: @#####.## Liabilities: @#####.## Net: @#####.##
&cool ($assets, 10), &cool ($liabilities, 9) , &cool ($assets-$liabilities,
10)
.
sub cool {
local ($n, $width) = @_ ;
$width -= 2 ; # back off for negative stuff
$n = sprintf (%.2f, $n) ; # sprintf is in later chapter
if ($n < 0) {

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

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