Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 143 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
143
Dung lượng
1,05 MB
Nội dung
Lời giới thiệu Cuốn sách nói 1: Giới thiệu Lịch sử Perl Mục đích Perl Những điều có sẵn Hỗ trợ Các khái niệm Dạo qua Perl Bài tập 2:Dữ liệu vô hướng Dữ liệu vô hướng gì? Số Xâu Toán tử Biến vô hướng Toán tử biến vô hướng giá trị vô hướng Đưa với print() Giá trị undef Bài tập 3: Dữ liệu mảng danh sách Mảng gì? Biểu diễn kí hiệu Biến Toán tử Vô hướng ngữ cảnh mảng mảng Nội suy biến thiên mảng Bài tập 4: Cấu trúc điều khiển Khối câu lệnh Câu lệnh if/unless Câu lệnh while/until Câu lệnh for Câu lệnh foreach Bài tập 5: Mảng kết hợp Mảng kết hợp gì? Biến mảng kết hợp Biểu diễn kí hiệu cho mảng kết hợp Toán tử mảng kết hợp Bài tập 6: Vào/ra sở Đưa vào từ STDIN Đưa vào từ toán tử hình thoi Đưa STDOUT Bài tập 7: Biểu thức qui Khái niệm biểu thức qui Cách dùng đơn giản biểu thức qui Mẫu Nói thêm toán tử đối sánh Phép Các toán tử split(0 join() Bài tập 8: Hàm Các hàm hệ thống người dùng Định nghĩa hàm người dùng Gọi hàm người dùng Cho lại giá trị Đối Biến cục hàm Bài tập 9: Các cấu trúc điều khiển Toán tử last Toán tử next Toán tử redo Khối có nhãn Bộ sửa đổi biểu thức &&, || ?: xem cấu trúc điều khiển Bài tập 10: Giải tệp kiểm thử tệp Tước hiệu tệp gì? Mở đóng tước hiệu tệp Một chút tiêu khiển: die() Dùng tước hiệu tệp Kiểm tra tệp -x Toán tử stat() lstat() Dùng _Filehandle Bài tập 11: Định dạng Định dạng gì? Xác định định dạng Gọi định dạng Nói thêm Fieldholder Định dạng đỉnh trang Đổi giá trị mặc định cho định dạng Bài tập 12: Thâm nhập danh mục Đi vòng quanh danh mục Globbing Giải danh mục Mở đóng giải danh mục Đọc giải danh mục Bài tập 13: Thao tác tệp danh mục Loại bỏ tệp Đổi tên tệp Tạo tên thay phiên cho tệp (liên kết) Tạo xoá danh mục Sửa đổi phép dùng Sửa đổi quyền dùng Sửa đổi thời hạn Bài tập 14: Quản lí tiến trình Dùng system() exec() Dùng Backquotes Dùng Proceses Filehandles Dùng folk Tóm tắt phép toán tiến trình Gửi nhận tín hiệu Bài tập 15: Biến đổi liệu khác Tìm xâu Trích thay xâu Định dạng liệu sprintf() Sắp xếp cao cấp Chuyển tự Bài tập 16: Thâm nhập sở liệu hệ thống Lấy mật hiệu thông tin nhóm Đóng mở gói liệu nhị phân Lấy thông tin mạng Lấy thông tin khác Bài tập 17: Thao tác sở liệu người dùng Cơ sở liệu DBM mảng DBM Mở đóng mảng DBM Dùng mảng DBM Cơ sở liệu thâm nhập ngẫu nhiên chiều dài cố định Cơ sở liệu chiều dài biến thiên (văn bản) Bài tập 18: Chuyển ngôn ngữ khác sang Perl Chuyển Chương trình awk sang Perl Chuyển Chương trình sed sang Perl Bài tập A: Trả lời tập B: Cơ sở nối mạng Mô hình chỗ cắm Khách mẫu Bộ phục vụ mẫu C: Những chủ đề chưa đề cập tới Bộ gỡ lỗi Dòng lệnh Các toán tử khác Nhiều, nhiều hàm Nhiều, nhiều biến đặt sẵn Xâu return (từ chương trình con) Toán tử eval (và s///e) Thao tác bảng kí hiệu với *FRED Toán tử goto Toán tử require Thư viện Perl 5.0 Goodies Chỉ mục Trong chương này: Lịch sử Perl Mục đích Perl Có sẵn Hỗ trợ Các khái niệm Dạo qua Perl Giới thiệu Lịch sử Perl Perl cách viết tắt cho “Practical Extraction and Report Language” Ngôn ngữ báo cáo trích rút thực hành, gọi “Pathologically Eclectic Rubbish Lister” - Bộ làm danh sách chiết trung bậy bạ bệnh hoạn Chẳng ích mà biện minh xem cách gọi hơn, hai Larry Wall, người sáng tạo kiến trúc sư chính, người cài đặt bảo trì Perl chấp nhận Ông tạo Perl cố gắng sản xuất số báo cáo từ cấp bậc tệp kiểu thư người dùng mạng Usenet hệ thống báo lỗi, lệnh awk làm xì hết Larry, người lập trình lười biếng, định toán vấn đề công cụ vạn mà anh dùng nơi khác Kết Perl Say chơi với đầu Perl chút, thêm chất liệu đó, Larry đưa cho cộng đồng độc giả Usenet, thường gọi “the Net” Người dùng thuộc toán phù du nghèo khó hệ thống toàn giới (quãng độ chục nghìn người) đưa lại cho anh phản hồi, hỏi cách làm thế kia, việc việc khác, nhiều điểm mà Larry chưa mường tượng việc giải cho Perl nhỏ bé Nhưng kết Perl trưởng thành, trưởng thành trưởng thành thêm nữa, tỉ lệ lõi UNIX (với bạn người mới, toàn lõi UNIX dùng khít vào 32K! Và may mắn ta có vài mega.) Nó trưởng thành tính Nó trưởng thành tính khả chuyển Điều mà có thời ngôn ngữ tí tẹo có tài liệu sử dụng 80 trang, sách Nutshell 400 trang, nhóm tin Usenet với 40 nghìn thuê bao, đoạn giới thiệu nhẹ nhàng Larry người bảo trì nhất, làm việc Perl kết thúc công việc thường ngày Và Perl phát triển Một cách đại thể lúc mà sách đạt tới điểm dừng nó, Larry đưa Perl nhất, 5.0, hứa hẹn có số tính thường hay yêu cầu, thiết kế lại từ bên trở (Larry bảo không dòng lệnh từ lần đưa trước, số ngày ngày.) Tuy nhiên, sách thử với Perl 4.0 (lần đưa gần viết điều này) Mọi thứ làm việc với 5.0 sau Perl Trong thực tế, chương trình Perl 1.0 làm việc tốt với gần đây, ngoại trừ vài thay đổi lạ cần cho tiến Mục đích Perl Perl thiết kế để trợ giúp cho người dùng UNIX với nhiệm vụ thông dụng mà nặng nề hay nhậy cảm với tính khả chuyển trình vỏ, kì lạ hay ngắn ngủi hay phức tạp để lập trình C hay ngôn ngữ công cụ UNIX khác Một bạn trở nên quen thuộc với Perl, bạn thấy thời gian để lấy trích dẫn trình vỏ (hay khai báo C) đúng, nhiều thời gian để đọc tin Usenet trượt tuyết đồi; Perl công cụ lớn tựa đòn bẩy Các cấu trúc chặt chẽ Perl cho phép bạn tạo (với tối thiểu om sòm nhặng sị) số giải pháp có ưu trần lặng hay công cụ tổng quát Cũng vậy, bạn lôi công cụ sang công việc tiếp, Perl khả chuyển cao độ lại có sẵn, bạn có nhiều thời gian để đọc tin Usenet trượt tuyết Giống ngôn ngữ, Perl “chỉ viết” - tức viết chương trình mà đọc Nhưng với ý đắn, bạn tránh kết tội thông thường Quả thế, Perl trông tiếng với không quen thuộc, với người lập trình thạo Perl, tựa dòng có tổng kiểm tra với sứ mệnh đời Nếu bạn tuân theo hướng dẫn sách chương trình bạn dễ đọc dễ bảo trì, chúng có lẽ không thắng tranh luận Perl khó hiểu Tính sẵn có Nếu bạn nhận Perl: not found bạn thử gọi Perl từ lớp vỏ người quản trị hệ thống bạn chẳng lên sốt Nhưng chí hệ thống bạn, bạn lấy không tiền (theo nghĩa “ăn trưa không tiền”) Perl phân phối theo phép công cộng GNU, nghĩa này, “bạn phân phát chương trình nhị phân Perl bạn làm chương trình gốc có sẵn cho người dùng trả tiền cả, bạn sửa đổi Perl, bạn phải phân phát chương trình gốc bạn cho nơi sửa đổi bạn nữa.” Và chất cho không Bạn lấy chương trình gốc Perl với giá băng trắng hay vài mêga byte qua đường dây Và không khoá Perl bán cho bạn mã nhị phân với ý tưởng đặc biệt “cấu hình phần cứng hỗ trợ” Trong thực tế, không cho không, chạy gọn gần thứ mà gọi UNIX hay tựa UNIX có trình biên dịch C Đấy trình tới với viết cấu hình bí gọi Cấu hình, móc chọc vào danh mục hệ thống để tìm thứ cần, điều chỉnh việc đưa vào tệp kí hiệu xác định tương ứng, chuyển cho bạn việc kiểm chứng phát Bên cạnh hệ thống UNIX hay tựa UNIX, người bị nghiện Perl đem sang Amiga, Atari ST, họ Macintosh, VMS, OS/2, chí MS/DOS - có lẽ nhiều vào lúc bạn đọc sách Vị trí xác có sẵn Perl biến động, bạn phải hỏi quanh (trên nhóm tin Usenet chẳng hạn) để có thông tin Nếu bạn hoàn toàn gì, cũ Perl có đĩa phần mềm CD-ROM UNIX Power Tools, Jerry Peek, Tim O’Reilly Mike Loukides (O’Reilly & Associates/ Random House Co., 1993) Hỗ trợ Perl đẻ Larry Wall, anh nâng niu Báo cáo lỗi yêu cầu nâng cao nói chung sửa chữa lần đưa sau, anh chẳng có nghĩa vụ để làm với chúng Tuy Larry thực thích thú nghe từ tất chúng ta, làm việc thực để thấy Perl dùng qui mô giới E-mail trực tiếp cho anh nói chung nhận trả lời (cho dù đơn máy trả lời email anh ấy), đáp ứng người Ích lợi việc viết thư trực tiếp cho Larry nhóm hỗ trợ Perl trực tuyến toàn giới, liên lạc thông qua nhóm tin Usenet comp.lang.perl Nếu bạn gửi email Internet, chưa vào Usenet, bạn tham gia nhóm cách gửi yêu cầu tới perl-users-request@virgina.edu, yêu cầu tới người nối bạn với cửa email hai chiều nhóm, cho bạn hứong dẫn cách làm việc Khi bạn tham gia nhóm tin, bạn thấy có khoảng 30 đến 60 “thư” ngày (vào lúc viết soạn thảo) đủ chủ đề từ câu hỏi người bắt đầu vấn đề chuyển chương trình phức tạp vấn đề giao diện, chí hay hai chương trình lớn Nhóm tin gần chuyên gia Perl điều phối Phần lớn thời gian, câu hỏi bạn có trả lời vòng vài phút tin bạn tới tủ nối Usenet Bạn thử mức độ hỗ trợ từ nhà sản xuất phần mềm ưa chuộng việc cho không này! Bản thân Larry đọc nhóm thời gian cho phép, xen viết có thẩm quyền vào để chấm dứt việc cãi hay làm sáng tỏ vấn đề Sau rốt, Usenet, có lẽ có chỗ để dễ dàng công bố Perl cho giới Bên cạnh nhóm tin, bạn nên đọc tạp chí Perl, việc phân phối Perl Một nguồn có thẩm quyền khác sách Programming Perl Larry Wall Randal L Schwatrz (O’Reilly & Associaté, 1990) Programming Perl xem “Sách lừa” bìa vẽ vật (hệt sách có lẽ biết tới với tên sách lạc đà không bướu) Sách lừa chứa thông tin tham khảo đầy đủ Perl dạng đóng gọn gàng Sách lừa bao gồm bảng tra tham khảo bật tài tình mà nguồn ưa chuộng cá nhân thông tin Perl Các khái niệm Một viết vỏ không khác dãy lệnh vỏ nhồi vào tệp văn Tệp “được làm cho chạy” cách bật bit thực (qua chmod +x filename) gõ tên tệp vào lời nhắc vỏ Bingo, chương trình vỏ lớn Chẳng hạn, viết để chạy lệnh date theo sau lệnh who tạo thực này: $ echo date > somecript $ echo who > somecript $ cat somescript date who $ chmod _x somescript $ somescript [output of date followed by who] $ Tương tự thế, chương trình Perl bó câu lệnh định nghĩa Perl ném vào tệp Rồi bạn bật bit thực gõ tên tệp lời nhắc vỏ Tuy nhiên, tệp phải chương trình Perl chương trình vỏ, nên cần bước phụ #! /usr/bin/perl làm dòng tệp Nhưng Perl bạn bị kẹt vào nơi không chuẩn, hay hệ điều hành tựa UNIX bạn không hiểu dòng #!, bạn có thêm việc phải làm Hãy hỏi người cài đặt Perl điều Các thí dụ sách giả sử bạn dùng chế thông thường Perl ngôn ngữ phi định dạng kiểu C - khoảng trắng hiệu (những phần tử chương trình, print hay +) tuỳ chọn, hai hiệu với bị lầm lẫn thành hiệu khác, trường hợp khoảng trắng thuộc loại bắt buộc (Khoảng trắng bao gồm dấu cách, dấu tab, dòng mới, đầu dòng hay kéo giấy.) Có vài cấu trúc đòi hỏi loại khoảng trắng chỗ đó, chúng trỏ ta nói tới chúng Bạn giả thiết loại khối lượng khoảng trắng hiệu tuỳ ý trường hợp khác Mặc dầu gần tất chương trình Perl viết tất dòng, cách điển hình chương trình Perl hay viết tụt lề chương trình C, với phần câu lệnh lồng viết tụt vào so với phần bao quanh Bạn thấy đầy thí dụ phong cách viết tụt lề điển hình toàn sách Cũng giống viết vỏ, chương trình Perl bao gồm tất câu lệnh perl tệp lấy tổ hợp chung mọt trình lớn cần thực Không có khái niệm trình “chính” main C Chú thích Perl giống thích lớp vỏ (hiện đại) Bất kì nằm dấu thăng (#) tới cuối dòng thích Không có khái niệm thích nhiều dòng C Không giống hầu hết lớp vỏ (nhưng giống awk sed), thông dịch Perl phân tích biên dịch hoàn toàn chương trình trước thực Điều có nghĩa bạn không nhận lỗi cú pháp từ chương trình chương trình bắt đầu chạy, có nghĩa khoảng trắng thích biến không làm chậm chương trình Trong thực tế, giai đoạn biên dịch bảo đảm việc thực nhanh chóng thao tác Perl bắt đầu, cung cấp động phụ để loại bỏ C ngôn ngữ tiện ích hệ thống đơn dựa tảng C biên dịch Việc biên dịch không thời gian - phi hiệu chương trình Perl cực lớn lại thực nhiệm vụ nhỏ bé chóng vánh (trong số nhiều nhiệm vụ tiềm năng) ra, thời gian chạy cho chương trình nhỏ xíu so với thời gian dịch Cho nên Perl giống biên dịch thông dịch Nó biên dịch chương trình đọc phân tích hoàn toàn trước câu lệnh thực Nó thông dịch mã đích ngồi trút đầy không gian đĩa Theo cách đó, tốt cho hai loại Phải thú thực, việc ẩn mã đích dịch lời gọi hay, danh sách mong ước cho Perl tương lai Larry Dạo qua Perl Chúng ta bắt đầu hành trình qua Perl việc dạo chút Việc dạo giới thiệu số tính khác cách bổ sung vào ứng dụng nhỏ Giải thích ngắn gọn - vùng chủ đề thảo luận chi tiết nhiều sau sách Nhưng dạo nhỏ cho bạn kinh nghiệm nhanh chóng ngôn ngữ, bạn định liệu bạn có thực muốn kết thúc sách hay đọc thêm tin Usenet hay chạy chơi trượt tuyết Chương trình “Xin chào người” Ta nhìn vào chương trình nhỏ mà thực tế có làm điều Đây chương trình “Xin chào người”: #!/usr/bin/perl print “Xin chào người\n”; Dòng câu thần nói chương trình Perl Nó lời thích cho Perl - nhớ lời thích nằm sau dấu thăng cuối dòng, giống hầu hết lớp vỏ đại hay awk Nếu vị trí bắt đầu trước chỗ mở đầu xâu (giống số âm khổng lồ lớn chiều dài xâu), chỗ mở đầu vị trí bắt đầu (dường bạn dùng làm vị trí bắt đầu) Nếu vị trí bắt đầu số dương khổng lồ, xâu rỗng cho lại Nói cách khác, làm điều bạn trông đợi phải làm, chừng bạn trông đợi cho lại khác lỗi Bỏ đối chiều dài hệt bạn đưa số khổng lồ vào cho đối - nắm lấy thứ từ vị trí chọn cuối xâu* Nếu đối thứ substr() biến (nói cách khác, xuất bên vế trái toán tử gán), thân substr() xuất vế bên trái toán tử gán Điều trông kì lạ bạn bắt nguồn từ tảng C, bạn chơi với vài dị BASIC hoàn toàn thông thường Điều nhận thay đổi kết phép gán phần xâu cho lại, mà có substr() dùng biểu thức Nói cách khác, substr($var, 3, 2) cho lại kí tự thứ tư thứ năm (bắt đầu từ 3, số đếm 2), việc gán điều làm thay đổi hai kí tự cho $var Giống như: $hw = “hello world!”; substr($hw, 0, 5) = “howdy”; # $hw “howdy world!” Chiều dài văn thay (cái nhận việc gán vào substr) văn thay thế, thí dụ Xâu tự động tăng trưởng hay co lại cần để điều hào với văn Sau thí dụ việc xâu thành ngắn hơn: substr($hw, 0, 5) = “hi”; # $hw “hi world!” xâu thành dài hơn: substr($hw, -6, 5) = “worldwide news”; # thay “world” Việc co lại hay dãn hiệu quả, cho nene bạ nđừng lo lắng việc dùng chúng cách bất kì, việc thay xâu xâu chiều dài tương đương nhanh bạn có hội Định dạng liệu sprintf() Toán tử printf dễ sử dụng dùng để lấy danh sách giá trị tạo dòng cho hiển thị giá trị theo cách điều khiển Toán tử sprintf() đồng với printf đối, cho lại printf đưa xâu riêng biệt (hãy nghĩ điều “xâu printf”.) Chẳng hạn, để tạo xâu bao gồm chữ X theo sau giá trị năm chữ số lấp đầy không $y, dễ dàng như: $result = sprintf(“X%05d”, $y); * Các Perl cổ không cho phép bỏ đối thứ ba, dẫn tới việc lập trình viên Perl tiền phong dùng số khổng lồ cho đối Bạn vượt qua điều hành trình khảo cổ Perl Nếu bạn không quen thuộc với xâu định dạng printf sprintf, tham khảo vào tài liệu printf hay sprintf (Tên sprintf, thực tế có nguồn gốc từ trình thư viện tên.) Sắp xếp nâng cao Trước đây, bạn biết bạn lấy danh sách xếp theo thứ tự ASCII tăng dần (như xâu), cách dùng toán tử sort có sẵn Điều xẩy bạn không muốn xếp theo thứ tự ASCII tăng dần, mà thay khác, kiểu xếp số? Được, Perl cho bạn công cụ bạn cần để làm việc Trong thực tế, bạn thấy sort Perl hoàn toàn tổng quát thực thứ tự xếp Để định nghĩa việc xếp theo mầu sắc khác, bạn cần định nghĩa trình so sánh mà mô tả cho cách so sánh hai phần tử Tại điều lại cần thiết? Được, bạn nghĩ nó, xếp việc đặt bó thứ theo trật tự so sánh tất chúng với Vì bạn so sánh chúng lúc nên bạn cần so sánh hai phần tử lúc, để cuối dùng bạn phát thứ tự cho cặp mà đặt toàn lũ vào hàng Trình so sánh định nghĩa trình thông thường Trình gọi gọi lại, lần lại truyền hai phần tử danh sách cần Trình phải xác định liệu giá trị thứ bé hơn, hay lớn giá trị thứ hai, cho lại giá trị mã hoá (sẽ mô tả sau đây) Tiến trình lặp lại danh sách hoàn toàn Để tiết kiệm tốc độ thực chút, hai giá trị không truyền ảng, mà thay trao cho trình giá trị biến toàn cục $a $b (Bạn đừng lo - giá trị nguyên thuỷ $a $b bảo vệ an toàn.) Trình nên cho lại giá trị âm $a “bé hơn’ $b, không $a “bằng” $b, số dương $a “lớn hơn” $b Bây bạn nhớ, “bé hơn” tương ứng với ý nghĩa bạn “bé hơn” - so sánh số, tương ứng với kí tự thứ ba xâu, hay chí tương ứng với giá trị mảng có dùng giá trị truyền vào khoá Đấy thực mềm dẻo Sau thí dụ chương trình xếp mà thứ theo thứ tự số: sub by_number { if ($a < $b) { -1; } elsif ($a == $b) { 0; } elsif ($a > $b) { 1; } } Bạn ý đến tên by_number Không có đặc biệt tên trình này, bạn thấy lại thích tên bắt đầu by_ giây lát Ta nhìn qua trình Nếu giá trị $a bé (về mặt số trường hợp này) giá trị $b, thf ta cho lại giá trị -1 Nếu giá trị số ta cho lại không, cho lại Vậy, theo mô tả ta cho trình so sánh xếp điều làm việc Làm ta dùng nó? Ta thử xếp danh sách sau $somelist = (1,2,4,8,16,32,64,128,256); Nếu ta dùng sort thông thường không sang sửa lại danh sách ta số chúng xâu, theo trật tự ASCII, tựa như: @wronglist = sort @somelist; # @wronglist (1,128,16,2,256,32,64,8) Chắc chắn xếp số Thôi được, ta cho sort trình xếp định nghĩa Tên trình xếp sau từ khoá sort, như: @rightlist = sort by_number @wronglist; # @rightlist (1,2,4,8,32,64,128,256) Đây mẹo Chú ý bạn đọc sort với trình xếp kèm theo kiểu người: “sắp xếp theo số” Đó lí đặt tên cho trình với tiền tố by_ Nếu bạn thiên muốn nhấn mạnh sau sort trình con, bạn đặt trước dấu (&), Perl không bận tâm nữa, biết nằm từ khoá sort danh sách phải tên trình Cái loại giá trị ba ngả kiểu -1, 0, dựa sở so sánh số thường xuất trình so sánh đến mức Perl có toán tử đặc biệt để làm điều lần thường gọi toán tử tầu vũ trụ, trông giống Dùng toán tử tầu vũ trụ này, trình xếp thay bằng: sub by_number { $a $b; } Bạn ý đến tầu vũ trụ hai biến Quả vậy, thực toán tử dài ba kí tự Con tầu vũ trụ cho lại giá trị dây chuyền if/elsif định nghĩa trước trình Bây điều có ngắn gọn, bạn viết tắt lời gọi xếp thêm nữa, việc thay tên trình xếp toàn trình xếp dòng, giống như: @rightlist = sort { $a $b } @wronglist; Một số người biện minh điều làm giảm tính dễ đọc Một số khác lại biện minh loại bỏ nhu cầu phải để tìm định nghĩa Perl chẳng quan tâm đến điều Qui tắc cá nhân chỗ không khớp dòng hay phải dùng nhiều lần, nên thành trình Toán tử tầu vũ trụ dành cho so sánh số, có toán tử xâu so sánh gọi cmp Toán tử cmp cho lại ba giá trị tuỳ theo việc so sánh xâu tương đối hai đối Cho nên, cách khác để viết trật tự mặc định là: @result = sort { $a cmp $b } @somelist; Có lẽ bạn chưa viết trình đích xác (bắt chước xếp mặc định có sẵn), chừng bạn chưa viết sách Perl Tuy thế, toán tử cmp có ích lợi nó, việc xây dựng lược đồ thứ tự theo tầng Chẳng hạn, bạn không cần đặt phần tử theo thứ tự số chừng chúng không mặt số, trường hợp chúng phải theo trật tự ASCII (Theo ngầm định, trình by_number dùng cho xâu phi số theo trật tự ngẫu nhiên trật tự số so sánh hai giá trị không.) Sau cách nói “cần so sánh theo số, chừng chúng chưa số, so sánh theo xâu”: sub by_mostly_number { ($a $b) || ($a cmp $b); } Điều làm việc nào? Thế này, kết tầu vũ trụ -1 hay phần lại biểu thức bị bỏ qua, giá trị -1 hay cho lại Néu tầu vũ trụ tính giá trị không toán tử cmp trở thành quan trọng, cho lại giá trị thứ tự thích hợp xem giá trị xâu Giá trị so sánh không thiết giá trị truyền vào Chẳng hạn, bạn có mảng kết hợp khoá tên đăng nhập giá trị tên thật người dùng Giả sử bạn muốn in biểu đồ tên đăng nhập tên thật cất giữ theo thứ tự tên thật Bạn làm điều nào? Thực tại, việc dễ dàng Ta giả sử giá trị mảng %names Tên đăng nhập danh sách key(%names) Điều ta muốn đạt tới danh sách tên đăng nhập theo giá trị tương ứng, với khoá riêng $a nào, ta cần nhìn vào $names{$a} xếp dựa điều Nếu bạn nghĩ điều theo cách gần nhưu tự viết rồi, trong: @sortedkeys = sort by_names keys(%names); sub by_names { $names{$a} cmp $names{$b}; } foreach (@sortedkeys) { print “$_ có tên thật $names{$_}\n”; } Với điều thêm vào so sánh Giả sử tên thật hai người dùng trùng Vì chất nẩy trình sort, lấy giá trị trước giá trị lần giá trị theo thứ tự đảo lại cho lần sau Điều không tốt báo cáo nạp vào chương trình so sánh cho việc báo cáo, phải cố gắng tránh thứ Với toán tử cmp, thật dễ dàng: sub by_names { ($names{$a} cmp $names{$b}) || ($a cmp $b); } Tại đây, tên thực giống xếp dựa tên đăng nhập Vì tên đăng nhập đảm bảo (sau rốt, chúng khoá mảng kết hợp này, hai khoá nhau), nên đảm bảo trật tự lặp lại Việc lập trình phòng ngự tốt ngày tốt cú điện thoại gọi đêm thao tác viên để hỏi tắt còi báo động Chuyển tự Khi bạn muốn lấy xâu thay thể nghiệm kí tự kí tự mới, hay xoá thể nghiệm kí tự đó, bạn làm điều với việc chọn lựa cẩn thận lệnh s/// Nhưng giả sử bạn phải thay đổi tất a thành b tất b thành a sao? Bạn làm điều với hai lệnh s/// lệnh thứ hai hoàn tác lại tất thay đổi lệnh thứ thực Tuy nhiên từ vỏ, phép chuyển đổi liệu đơn giản - cần dùng lệnh tr chuẩn: tr ab ba < indata >outdata (Nếu bạn lệnh tr, xin xem tài liệu - công cụ có ích cho túi mẹo bạn.) Tương tự, Perl cung cấp toán tử tr làm việc giống thế: tr/ab/ba/; Toán tử tr nhận hai đối : xâu cũ xâu Các đối làm việc giống hai đối s///: nói cách khác, có định bên xuất sau từ khoá tr làm tách biệt kết thúc hai đối (trong trường hợp này, sổ chéo, gần kí tự được) Các đối cho toán tử tr giống hệt đối lệnh tr Toán tử tr sửa đổi nội dung biến $_ (giống s///), tìm kí tự xâu cũ bên biến $_ Tất kí tự tìm thấy thay kí tự tương ứng xâu Sau số thí dụ: $_ = “fred and barney”; tr/fb/bf/; # $_ “bred and farney” tr/abcde/ABCDE/; # $_ “BrED AnD fArnEy” tr/a-z/A-Z/; # $_ “BRED AND FARNEY” Bạn lưu ý đến phạm vi kí tự hai kí tự phân cách sổ chéo Nếu bạn cần sổ chéo kí tự xâu đặt trước sổ chéo ngược Nếu xâu ngắn xâu cũ, kí tự cuối xâu lặp lại đủ số lần để làm cho xâu có chiều dài nhau, giống như: $_ = “fred and barney”; tr/a-z/ABCDE/d; # $_ “ED AD BAE” Bạn lưu ý đến cách thức chữ sau e biến kí tự tương ứng danh sách dấu cách không bị tác động chúng không xuất danh sách cũ Điều tương tự với thao tác tuỳ chọn -d lệnh tr Nếu danh sách rỗng tuỳ chọn d danh sách giống hệt danh sách cũ Điều ngu, phảti thay I cho I cho 2, thực tế làm đôi điều ích lợi Giá trị cho lại toán tử tr/// số kí tự sánh theo xâu cũ, việc thay đổi kí tự chúng, bạn nhận số loại kí tự bên xâu Chẳng hạn: $_ = “fred and barney”; $count = tr/a-z//; # $_ không thay đổi $count 13 $count2 = tr/a-z/A-Z/; # $_ chữ hoa $count2 13 Nếu bạn thêm c vào cuối (giống viết thêm d) điều có nghĩa làm đầy đủ xâu cũ tất 256 kí tự Bất kì kí tự bạn liệt kê xâu cũ bị loại bỏ khỏi tập tất kí tự có thể; kí tự lại, lấy theo dẫy từ thấp đến cao, từ xâu cũ Vậy, cách để đếm hay thay đổi kí tự phi số xâu là: $_ = “fred and barney”; $count = tr/a-z//c; # $_ không đổi, $count tr/a-z/_/c; # $_ “fred_and_barney” (phi chữ => _) tr/a-z//cd; # $_ “fredandbarney” (xoá kí tự khác chữ) Chú ý tuỳ chọn tổ hợp, trình bầy thí dụ cuối, nơi trước hết bổ dung cho tập hợp (danh sách chữ trở thành danh sách tất phi chữ) dùng tuỳ chọn d để xoá kí tự tập Tuỳ chọn cuối cho tr/// s, mà làm cứng lại nhiều liên tiếp chữ dịch vào Zem thí dụ ta nhìn vào điều này: $_ = “aaabbcccdefghi”; tr/defghi/abcdd/s; # $_ “aaabbcccabcd” Chú ý def trở thành abc, ghi (mà đáng trở thành ddd tuỳ chọn s) lại trở thành d Bạn để ý chữ liên tiếp phần đầu xâu không bị đóng cứng lại chúng không kết việc dịch Sau thêm số thí dụ nữa: $_ = “fred and barney, wilma and betty”; tr/a-z/X/s; # $_ “X X X, X X X” $_ = “fred and barney, wilma and betty”; tr/a-z/_/cs; # $_ “fred_and_barney_wilma_and_betty” Trong thí dụ thứ nhất, từ (chữ liên tiếp) bị đóng cứng lại chữ X Trong thí dụ thứ hai, tất chùm phi chữ liên tiếp trở thành dấu gạch thấp Giống s///, toán tử tr hướng đích vào xâu khác bên cạnh $_ việc dùng toán tử =~: $name = “fred and barney”; $name =~ tr/aeiou/X/; # $name “frXd Xnd bXrnXy” Bài tập Xem Phụ lục A lời giải Hãy viết chương trình để đọc danh sách tên tệp, bẻ tên thành phần đầu đuôi (Mọi thứ dấu sổ chéo cuối đầu, thứ sau dấu sổ chéo cuối đuôi Nếu sổ chéo tất đuôi.) Bạn thử với thứ /fred, barney fred/barney Kết có nghĩa không? Hãy viết chương trình để đọc vào danh sách số xếp chúng theo thứ tự số, in danh sách kết theo cột thẳng lề phải Hãy viết chương trình in tên thực tên đăng nhập người dùng tệp /etc/passwd, theo tên cuối người dùng Giải pháp bạn có làm việc hai người có tên cuối không? Hãy tạo tệp bao gồm câu, câu dòng Hãy viết chương trình làm cho kí tự đầu câu trở thành chữ hoa, phần lại câu thành chữ thường (Liệu có làm việc kí tự chữ không? Bạn làm điều câu không dòng?) 16 Thâm nhập sở liệu hệ thống 17 Thao tác sở liệu người dùng Cơ sở liệu DBM mảng DBM Phần lớn hệ thống UNIX có thư viện chuẩn gọi DBM Thư viện cung cấp tiện nghi quản trị sở liệu đơn giản mà cho phép chương trình cất giữ tuyển tập cặp khoá-giá trị cặp tệp đĩa Những tệp trì giá trị sở liệu lần gọi chương trình có dùng sở liệu chương trình bổ sung giá trị mới, cập nhật giá trị có, hay xoá giá trị cũ Thư viện DBM đơn giản, lại sẵn có, số chương trình hệ thống dùng cho nhu cầu giản dị chúng Chẳng hạn, chương trình gửi thư Berkeley (và biến thể suy dẫn nó) cất giữ sở liệu biệt hiệu (ánh xạ địa thư vào nơi nhận) sở liệu DBM Phần mềm tin Usenet phủ cập dùng sở liệu DBM để giữ dấu vết cac báo xem gần Perl cung cấp việc thâm nhập vào chế DBM thông qua phương tiện thông minh hơn: mảng kết hợp kết hợp với sở liệu DBM qua tiến trình tương tự mở tập Mảng kết hợp (còn gọi mảng DBM) dùng để thâm nhập sửa đổi sở liệu DBM Việc tạo phần tử mảng làm thay đổi sở liệu DBM Việc xoá phần tử xoá giá trị khỏi sở liệu DBM Và Kích cỡ, số lượng loại khoá giá trị sở liệu DBM có hạn chế, mảng DBM có hạn chế Bạn xem lidbm chi tiết Nói chung, bạn giữ khoá giá trị xuống khoảng 1000 kí tự hay có lẽ OK Mở đóng mảng DBM Để kết hợp sở liệu DBM với mảng DBM, bạn dùng toán tử dbmopen() , trông này: dbmopen(%ARRAYNAME, “dbmfilename”, $mode); Tham biến %ARRAYNAME mảng kết hợp Perl (Nếu mảng có giá trị giá trị bị bỏ đi.) Mảng kết hợp trở thành nối với sở liệu DBM có tên dbmfilename, thông thường cất giữ đĩa cặp tệp có tên dbmfilenam.dir dbmfilename.pag Bất kì tên mảng kết hợp hợp pháp dùng được, tên mảng toàn chữ hoa dùng điển hình tương tự với tước hiệu tệp Tham biến $mode số kiểm soát bit cho phép cặp tệp tệp cần tạo Con số điển hình xác định theo hệ tám: giá trị thường hay dùng 0644 cho phép người đọc, riêng người chủ có phép đọc-ghi Nếu tệp tồn tham biến tác dụng Chẳng hạn: dbmopen(%FRED, mydatabase “mydatabase”, 0644); # mở %FRED lên Lời gọi kết hợp mảng kết hợp %FRED với tệp đĩa mydatabase.dir mydatabase.pag danh mục Nếu tệp chưa tồn chúng tạo với mốt 0644 Giá trị cho lại từ dbmopen() sở liệu mở hay tạo được, sai trường hợp ngược lại, hệt việc gọi open() Nếu bạn không muốn tệp tạo dùng giá trị $mode undef Chẳng hạn: dbmode (%A, “/etc/xx”, undef) || die “không mở DBM /etc/xx”; Trong trường hợp này, tệp /etc/xx.dir /etc/xx.pag mở lời gọi dbmopen() cho lại sai, thay cố gắng tạo tệp Mảng DBM mở suốt lúc thực chương trình Khi chương trình kết thúc kết hợp kết thúc Bạn phá vỡ kết hợp theo cách thức tương tự việc đóng tước hiệu tệp, việc dùng toán tử dbmclose(): dbmclose(%A); Giống close(), dbmclose() cho lại sai điều sai Dùng mảng DBM Một sở liệu mở tham khảo tới mảng DBM ánh xạ vào tham khảo sở liệu Việc thay đổi hay bổ sung giá trị vào mảng tạo cho mục tương ứng ghi vào tệp đĩa Chẳng hạn, %FRED mở thí dụ trước, ta thêm vào, xoá bỏ hay thâm nhập vào sở liệu, giống này: $FRED{“fred”} = “bedrok”; # tạo (cập nhật) phần tử delete $FRED{“barney”); # bỏ phần tử csdl foreach $key (keys %FRED) { # qua giá trị print “$key có giá trị $FRED{$key}\n”; } Chu trình cuối phải nhòm qua toàn tệp đĩa hai lần: lần để thâm nhập vào khoá, lần thứ hai để tra cứu giá trị từ khoá Nếu nhòm qua mảng DBM nói chung hiệu đĩa dùng toán tử each(), qua bước: while ( ($key, $value) = each (%FRED)) { print “$key có giá trị $value\n”; } Nếu bạn thâm nhập vào sở liệu DBM hệ thống, sở liệu tạo sendmail hay tin Usenet, bạn phải biết chương trình nói chung gắn thêm đuôi kí tự NUL (“\0”) vào cuối xâu Các trình thư viện DBM không cần NUL (chúng giải liệu nhị phân cách đếm byte xâu kết thúc NUL), NUL cất giữ phần liệu Do bạn phải gắn kí tự NUL vào cuối liệu bỏ NUL khỏi cuối giá trị cho lại liệu có nghĩa Chẳng hạn, để tra cứu merlyn sở liệu biệt hiệu, bạn thử điều kiểu: dbmopen(%ALI, “/etc/aliases”, undef) || die “Không biệt hiệu?”; $value = $ALI{“merlyb\0”}; # lưu ý NUL thêmvào chop($value); #loại bỏ NUL thêm vào print “Thư Randal gắn đầu cho: $value\n”; # in kết Bản UNIX bạn đưa sở liệu biệt hiệu vào /usr/lib thay /etc Bạn phải lục lọi để tìm Cơ sở liệu thâm nhập ngẫu nhiên chiều dài cố định Một dạng khác liệu bền bỉ tệp đĩa hướng ghi với chiều dài cố định Trong lược đồ này, liệu bao gồm số ghi với chiều dài nhưu Việc đánh số cho ghi không quan trọng hay hay xác định lược đồ định số Chẳng hạn, có loạt ghi mà liệu có 40 kí tự họ, kí tự tên đệm, 40 kí tự tên, số nguyên hai byte cho tuổi Mỗi ghi có chiều dài 83 byte Néu ta đọc tất liệu sở liệu ta phải đọc chùm 83 byte đến cuối Nếu ta muốn tới ghi thứ năm ta phải nhẩy qua lầm 83 byte (332 byte) đọc trực tiếp ghi thứ năm Perl hỗ trợ cho chương trình dùng kiểu tệp đĩa Có đôi điều cần biết thêm bên cạnh điều bạn biết: Mở tệp đĩa cho đọc ghi Chuyển quanh tệp tới vị trí Lấy liệu theo độ dài thay theo dòng tiếp Ghi liệu lên theo khối chiều dài cố định Toán tử open() nhận dấu cộng bổ sung trước đặc tả hướng vào/ra để tệp thực mở cho đọc ghi Chẳng hạn: open(A, “+d”); # tạo tệp d, với thâm nhập đọc/ghi open(E, “+>>f”); # mở hay tạo tệp f với việc thâm nhập đọc/ghi Lưu ý tất điều ta làm bổ sung thêm dấu cộng vào hướng vào/ra Một ta thu việc mở tệp ta cần di chuyển quanh Bạn làm điều với toán tử seek(), nhận ba tham biến trình thư viện fseek() Tham biến thứ tước hiệu tệp; tham biến thứ hai cho khoảng chênh, diễn giải kèm với tham biến thứ ba Thông thường, bạn muốn tham biến thứ ba không tham biến thứ hai chọn vị trí tuyệt đối cho lần đọc tiếp hay ghi tiếp lên tệp Chẳng hạn, tới ghi thứ năm tước hiệu tệp NAMES (như mô tả trên), bạn làm điều này: seek(NAMES, 4*83, 0); Một trỏ tệp định vị lại việc đưa vào hay đưa tiếp Với việc đưa ra, dùng toán tử print phải chắn liệu bạn viết chiều dài Để thu chiều dài, gọi tới toán tử pack(): print NAMES pack(“A40Â40s”, $first, $middle, $last, $age); Bộ xác định pack() cho 49 kí tự $first, kí tự cho $middle, 40 kí tự cho $last số nguyên ngắn (2 byte) cho $age Điều tính thành 83 byte chiều dài, ghi vị trị tệp Cuối cùng, cần lấy ghi đặc biệt Mặc dầu toán tử cho lại tất liệu từ vị trí dòng tiếp, điều lại không đúng; liệu giả thiết trải 83 kí tự lại dòng chỗ Thay thế, ta dùng toán tử read(), trông cách làm việc hệt lời gọi hệ thống UNIX tương ứng: $count = read(NAMES, $buf, 83); Tham biến thứ read() tưức hiệu tệp Tham biến thứ hai biến vô hướng mà giữ liệu đọc Tham biến thứ ba cho số byte cần đọc Giá trị cho lại từ read() số byte thực tế đọc - điển hình số byte yêu cầu tước hiệu tệp không mở hay bạn gần tới cuối tệp Một bạn có liệu 83 kí tự cần chặt thành thành phần toán tử unpac(): ($first, $middle, $last, $age) = unpack(“A40A40s”, $buf); Lưư ý xâu định dạng cho pack unpack Phần lớn chương trìnhcất giữ xâu biến từ đầu chương trình, chí tính chiều dài ghi việc dùng pack() thay bỏ rải rác 83 nơi: $names = “A40AA40s”; $names_length = length(pack($names)) ; # 83 Cơ sở liệu (văn bản) chiều dài thay đổi Nhiều sở liệu hệ thống (và có lẽ phần lớn sở liệu người dùng tạo ra) chuỗi dòng văn người đọc được,với ghi dòng Chẳng hạn, tệp mật hiệu chưa dòng cho người hệ thống, tệp máy chủ chứa dòng cho tên máy chủ Rất thường sở liệu cập nhật trình soan thảo văn đơn giản Việc cập nhật sở liệu bao gồm việc đọc tất vào vùng trung gian (hoặc nhớ đĩa khác), thực thay đổi cần thiết, ghi kết ngược trở lại tệp nguyên thuỷ tạo tệp với tên sau xoá hay đổi tên cũ Bạn coi việc bước chép - liệu từ sở liệu nguyên gốc sang sở liệu ấy, tiến hành tahy đổi chép Perl hỗ trợ cho việc soạn thảo kiểu chép sở liệu hướng dòng cách dùng việc soạn thảo chỗ Soạn thảo chỗ việc sửa đổi cách thức toán tử hình thoi () đọc liệu từ danh sách tệp xác định dòng lệnh Thông thường mốt soạn thảo thâm nhập tới việc đặt đối dòng lệnh -i, đặt lẫy cho mốt soạn thảo chỗ từ bên chương trình, biểu thị thí dụ sau Để đặt lẫy cho mốt soạn thảo chỗ, bạn đặt giá trị vào biến vô hướng $^I Giá trị biến quan trọng, thảo luận Khi toán tử hình thoi sử dụng $^I có giá trị (thay undef), bước đánh dấu ##INPLACE## đoạn mã sau thêm vào danh sách hành động ngầm định mà toán tử hình thoi nhận: $ARGV = shift @ARGV; open(ARGV, “$ARGV”); ## INPLACE ## select(ARGVOUT) ; ## INPLACE ## Hiệu chỗ việc đọc từ toán tử hình thoi lấy từ tệp cũ, việc ghi lên tước hiệu tệp ngầm định lại chuyển sang tệp Tệp cũ tệp dự phòng, mà tước hiệu tệp với phần hậu tố giá trị biến $^I (Cũng có chút ảo thuật để chép bit người chủ phép dùng từ tệp cũ sang tệp mới.) Những bước lặp lại lần tệp rút từ mảng @ARGV Các giá trị điển hình cho $^I bak hay ~, để tạo tệp dự phòng giống với trình soạn thảo tạo Một giá trị kì lạ có ích cho $^I xâu rỗng, “”, gây việc tệp cũ bị xoá sau việc soạn thảo hoàn tất Điều không may hệ thống hay chương trình bị hỏng thực chương trình bạn bạn tất liệu cũ, khuyến cáo điều cho người bạo dạn, dại dột hay tin cậy Sau cách thay đổi việc đăng nhập vào /bin/sh cách sửa đổi tệp mật hiệu: @ARGV = (“/etc/passwd”); # nhồi vào toán tử hình thoi $^I = “.bak”; # ghi /etc/passwd.bak để an toàn while () { # chu trình chính, lần cho dòng /etc/passwd s#L[^;]*$#:/bin/sh#; # đổi vỏ thành /bin/sh print; # gửi ARGVOUT: /etc/passwd } Như bạn thấy, chương trình đơn giản Trong thực tế, chương trình sinh toàn với vài đối dòng lệnh perl -p -i.bak -e ‘s#:[^:] ‘*$#:/bin/sh#’ /etc/passwd Chuyển mạch -p đóng ngoặc nhọn chương trình bạn với chu trình while có chứa câu lệnh print Chuyển mạch -i đặt giá trị vào biến $^I Chuyển mạch -e xác định đối sau phần chương trình Perl thân chu trình; đối cuối cho giá trị khởi đầu cho @ARGV Các đối dòng lệnh thảo luận chi tiết sách lừa perl Bài tập Hãy tạo chương trình để mở sở liệu sendmail in tất mục Hãy tạo hai chương trình: đọc liệu hình thoi, chặt thành từ, cập nhật tệp DBM có ghi số lần xuất từ; chương trình mở tệp DBN cho hiển thị kết xếp theo số đếm giảm dần Hãy chạy chương trình thứ vài tệp xem liệu chương trình thứ hai có nhặt số đếm không [...]... lại đi Từ bí mật là gì?”; $guess = ; chop($guess); } # kết thúc của while } # kết thúc của “not Randal” Như bạn có thể thấy, chương trình này khác xa với chương trình đơn giản Xin chào, mọi người, nhưng nó vẫn còn rất nhỏ bé và làm việc được, và nó quả làm được tí chút với cái ngắn xíu vậy đây chính là cách thức của Perl Perl đưa ra tính năng về các biểu thức chính qui có trong mọi trình tiện... Từ bí mật là gì?”; $guess = ; chop($guess); } # kết thúc của while } # kết thúc của “not Randal” Bạn hãy chú ý nhìn vào từ bí mật Nếu không tìm thấy từ này thì giá trị của $secretword sẽ là một xâu rỗng*, mà ta có thể kiểm tra liệu ta có muốn xác định một từ bí mật mặc định cho ai đó khác không Đây là cách xem nó: [ phần còn lại của chương trình đã bị xoá ] $secretword = $words{$name}; # lấy... từ đầu lần nữa } } # kết thúc của while not correct } # kết thúc của “not Randal” Bạn sẽ để ý rằng chúng ta đang dùng biến vô hướng $correct để chỉ ra rằng chúng ta vẫn đang tìm ra mật hiệu đúng, hay rằng chúng ta không tìm thấy Chương trình này cũng chỉ ra khối elsif của câu lệnh if-then-else Không có lệnh nào tương đương như thế trong C hay awk - đó là việc viết tắt của khối else cùng với một điều... trông giống và hành động rất giống như phép thay thế của các trình soạn thảo khác nhau Bây giờ để có được bất kì cái gì còn lại trở thành chữ thường thì ta phải dịch xâu này dùng toán tử tr Nó trông rất giống chỉ lệnh tr của UNIX, nhận một danh sách các kí tự để tìm và một danh sách các kí tự để thay thế chúng Với thí dụ của ta, để đặt nội dung của $name thành chữ thường, ta dùng: $name =~ tr/A-Z/a-z/;... điểm mạnh của Perl Tuy nhiên, chém vào tên để cho ta có thể so sánh nó và tra cứu nó trong bảng thì sẽ phá huỷ mất tên ta vừa đưa vào Cho nên, trước khi chém vào tên, cần phải cất giữ nó vào trong @original_name (Giống như các kí hiệu C, biến Perl bao gồm các chữ, chữ số và dấu gạch thấp và có thể có chiều dài gần như không giới hạn.) Vậy ta có thể làm tham khảo tới $original_name về sau Perl có nhiều... phải là từ đúng ” Nhiều chương trình Perl viết tốt đọc rất giống tiếng Anh, đưa lại cho bạn một chút tự do với Perl hay tiếng Anh (Nhưng bạn chắc chắn không đoạt giải Pulitzer theo cách đó.) Chú ý rằng chương trình con này giả thiết rằng giá trị của mảng %words được chương trình chính đặt Điều này không đặc biệt là hay, nhưng chẳng có gì so sánh được với static của C đối với chương trình con - nói... để mail gửi dữ liệu của nó theo cách của nó Để cho đúng, chúng ta có thể gửi câu trả lời đúng cũng như câu trả lời sai, nhưng rồi ai đó đọc qua vai tôi (hay núp trong hệ thống thư) trong khi tôi đang đọc thư mà có thể lấy quá nhiều thông tin có ích Perl có thể cũng gọi cả các lệnh với việc kiểm soát chính xác trên danh sách đối, mở các tước hiệu tệp, hay thậm chí lôi ra cả bản sao của chương trình hiện... thông tin này trong mảng @password Khoản mục thứ bẩy của mảng @password (chỉ số 6) là trường GCOS, mà thường là một xâu có chứa danh sách các giá trị các nhau bởi dấu phẩy Giá trị đầu tiên của xâu đó thường là tên đầy đủ của người Một khi hai câu lệnh đầu này đã hoàn tất thì chúng ta có toàn bộ trường GCOS trong $name Tên đầy đủ chỉ là phần thứ nhất của xâu trước dấu phẩy đầu tiên, cho nên câu lệnh thứ... chất liệu mới sẽ đưa vào đây } } close (WORDSLIST); } Tại điểm có đánh dấu “chất liệu mới sẽ đưa vào đây,” ta biết ba điều: tên của tệp (trong $filename), tên một ai đó (trong $name), và rằng từ bí mật của một người (trong $Word) Sau đây là chỗ để dùng công cụ sinh báo cáo của Perl Ta định nghĩa một định dạng ở đâu đó trong chương trình (thông thường gần cuối, giống như chương trình con): format STDOUT... lệnh foreach bao giờ cũng theo thứ tự bảng chữ Thân của chu trình foreach nạp vào hai biến được dùng trong định dạng STDOUT, và rồi gọi tới định dạng đó Chú ý rằng chúng ta đoán ra tuổi của một phần tử bằng cách trừ thời gian UNIX đã cất giữ (trong mảng) từ thời gian hiện tại (như kết quả của time) và rồi chia cho 3600 (để chuyển từ giây sang giờ) Perl cũng cung cấp những cách thức dễ dàng để tạo ra ... goto Toán tử require Thư viện Perl 5.0 Goodies Chỉ mục Trong chương này: Lịch sử Perl Mục đích Perl Có sẵn Hỗ trợ Các khái niệm Dạo qua Perl Giới thiệu Lịch sử Perl Perl cách viết tắt cho “Practical... điều này) Mọi thứ làm việc với 5.0 sau Perl Trong thực tế, chương trình Perl 1.0 làm việc tốt với gần đây, ngoại trừ vài thay đổi lạ cần cho tiến Mục đích Perl Perl thiết kế để trợ giúp cho người... không tiền”) Perl phân phối theo phép công cộng GNU, nghĩa này, “bạn phân phát chương trình nhị phân Perl bạn làm chương trình gốc có sẵn cho người dùng trả tiền cả, bạn sửa đổi Perl, bạn phải