Learning Perl - Chương 6: Nhập/Xuất căn bản
1. Nhập vào từ STDIN
2. Nhập vào từ toán tử hình thoi
3. Đưa ra STDOUT
4. Bài tập
6.1 Nhập vào từ STDIN
Việc đọc từ lối vào chuẩn (thông qua tước tiệu tệp STDIN-viết tắt của Standard Input
trong Perl) thì thật dễ dàng. Chúng ta đã làm việc này với toán tử <STDIN>. Việc
dùng toán tử này trong ngữ cảnh vô hướng trả về cho bạn bạn một dòng của cái
đang được nhập vào, hoặc undef nếu không còn dòng nào nữa, giống như:
$a = <STDIN>; # đọc dòng tiếp theo
Việc dùng toán tử này trong ngữ cảnh mảng sẽ cho bạn tất cả các dòng còn lại như
một danh sách - mỗi phần tử của danh sách này là một dòng, bao gồm cả ký tự
xuống dòng mới của nó. Chúng ta đã thấy điều này trước đây, nhưng xem như đây
là bài ôn tập, nó có thể trông như một cái gì đó tựa như thế này:
@a = <STDIN>;
Một cách điển hình, một trong những điều bạn muốn làm là đọc tất cả các dòng một
lúc, và làm điều gì đó trên mỗi dòng. Một cách chung để làm điều này là:
while ($_ = <STDIN>) {
# xử lí $_ tại đây (cho từng dòng)
}
Cứ mỗi khi một dòng được đọc vào, <STDIN> lại trả về một giá trị đúng (true), cho
nên chu trình tiếp tục thực hiện. Khi <STDIN> không còn dòng nào để đọc nữa thì
nó trả về undef, tương đương với giá trị sai (false), kết thúc chu trình.
Việc đọc một giá trị vô hướng từ <STDIN> vào $_ và dùng giá trị đó làm biểu thức
điều khiển cho chu trình (như trong ví dụ vừa rồi) thường hay xuất hiện đến mức
Perl có hẳn một cách viết tắt cho nó. Bất kì khi nào việc kiểm tra chu trình chỉ bao
gồm một toán tử đưa vào (cái gì đó tựa như <...>), thì Perl tự động sao dòng được
đọc vào sẽ lưu trong biến $_.
while ($_ = <STDIN>) { # giống while ($_ = <STDIN>)
chop; # giống chop($_)
#!/usr/bin/perl
@ARGV = ("aaa", "bbb", "ccc");
while (<>) { # xu ly cac file aa, bbb va ccc
print "This line is: $_";
}
Trong Chương 10:Tước hiệu tệp và và kiểm tra tệp, chúng ta sẽ tìm hiểu cách mở
và đóng các tệp xác định vào thời điểm xác định, tuy nhiên các làm trong ví dụ trên
vẫn dùng được trong một số chương trình Perl của bạn.
6.3 Đưa ra STDOUT
Perl dùng các toán tử print và printf để ghi/xuất dữ liệu ra STDOUT. Ta hãy xem
cách chúng được dùng.
• 6.3.1 Dùng print cho cách xuất thông thường
Chúng ta đã dùng print để hiển thị văn bản ra STDOUT (thường được hiển là màn
hình). Ta hãy mở rộng thêm một chút.
Toán tử print nhận một danh sách các xâu, và gửi lần lượt từng xâu ra STDOUT.
Điều có thể không hiển nhiên là ở chỗ print thực sự chỉ là toán tử danh sách, và trả
về một giá trị giống như bất kì toán tử danh sách nào khác. Nói cách khác:
$a = print ("xin chao", "moi nguoi", "\n");
sẽ là một cách khác để nói "xin chao moi nguoi". Giá trị trả lại của print là một giá trị
đúng hay sai, chỉ ra sự thành công của việc in. Nó gần như bao giờ cũng thành
công, trừ phi bạn gặp lỗi vào/ra nào đó, cho nên $a trong trường hợp này sẽ gần
như bao giờ cũng là 1.
Đôi khi, bạn sẽ cần bổ sung thêm các dấu ngoặc vào print như được nêu trong ví dụ
này, đặc biệt nếu cái đầu tiên mà bạn muốn in bắt đầu với một dấu mở ngoặc tròn,
như trong:
print (2+3), "xin chao"; # sai! in 5, bỏ qua "xin chao"
print ((2+3), "xin chao"); # đúng! in "5xin chao"
print 2+3, "xin chao"; # cũng đúng! in "5xin chao"
• 6.3.2 Dùng printf xuất dữ liệu theo định dạng
Bạn có thể muốn có một chút ít kiểm soát với dữ liệu in ra hơn là khả năng print
1
5
4
3
6
3. Bạn hãy viết 1 chương trình đọc vào một danh sách các xâu và in danh sách
các xâu mới đọc (các xâu được canh lề phải 20 ký tự khi in).
4. Hãy hãy sửa lại chương trình ở trên sao cho chương trình in ra các xâu được
canh lề phải với n ký tự (với n được nhập vào bởi người dùng).