Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 54 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
54
Dung lượng
480,5 KB
Nội dung
Lời nói đầu Quyển tài liệu viết trình tìm hiểu PERL hướng dẫn thầy giáo Nguyễn Thanh Bình (Trưởng khoa công nghệ phần mềm Trường ĐHBKHN).Trong trình nghiên cứu tìm hiểu thấy nhiều mặt mạnh ,cũng mặt hạn chế so với ngôn ngữ lập trình khác (Các bạn thấy rõ sau đọc xong tài liệu ).Nhưng hoàn thành thời gian ngắn nên tài liệu nói lên vấn đề PERL : -Chương I : Giới thiệu tổng quan PERL -Chương II : Các kiểu dư liệu -Chương III : Toán tử hàm có sẵn -Chương IV : Các câu lệnh điều kiện -Chương V : Hàm -Chương VI : Tệp thao tác vào -Chương VII : Các biểu thức quy -Chương VIII:Tham chiếu Trong chương tài liệu đưa nhận xét so sánh khác biệt PERL với ngôn ngữ khác,những lưu ý ,các câu hỏi ôn tập,các ví dụ cụ thể cuối tập áp dụng Trong viết tài liệu cố gắng nghiên cứu tìm hiểu nhiều chắn tránh khỏi sai xót mong bạn thông cảm.Mọi trao đổi đóng góp ý kiến bạn liên hệ với theo địa : duy@tan.com,hoa_it_hut@yahoo.com,little_chic_choe@yahoo.com thaobcf@yahoo.com,tungitbk@yahoo.com liên hệ trực tiếp với Nhóm9Tin5K46(Vân Anh,Hòa,Tân,Thảo,Tùng) xin chân thành cảm ơn đóng góp ý kiến bạn Dưới số tài liệu tham khảo : + Teach Yourself PERL5 in 21days by David Till + PERL by Example by David Medinets + PERL unleashed by Kamran Husain and Robert F.Breedlove + Practical PERL Programming by A.D.Marshall 1999 + PERL Quick Reference By Mícchéal Ó Foghlú +Teach Yourself CGI Programming with PERL in a Week by Eric Herrmann ………………………………………………………………………………… Chương 1: Tổng quan Perl 1.Lịch sử phát triển Perl (Practical Extraction and Report Language) trình thông dịch dễ sử dụng, hiệu quả, hoàn chỉnh viết Larry Wall với giúp đỡ nhiều đồng vào năm 1986 Perl viết ngôn ngữ lập trình C Perl dùng để lấy liệu từ file text in báo cáo chuyển đổi file text thành file khác Ngoài ra, Perl cung cấp nhiều công cụ khác để giải vấn đề phức tạp bao gồm lập trình hệ thống Hiện Perl có đến phiên Mặc dù có tương đồng với C Perl giải vấn đề kiểu liệu, vị trí nhớ cách tự động nhẹ nhàng Perl có nhiều ưu điểm: Hiệu , dễ sử dụng hoàn chỉnh Perl chuyển đổi dễ dàng hàm sẵn có thư viện C C++ thành hàm tương tự Perl Tuy vậy, Perl có nhiều nhược điểm Trước hết, trình thông dịch, không nhanh C hay C++ Mặt khác, để cung cấp chương trình viết Perl, đồng thời bạn phải cung cấp mã nguồn Một số ứng dụng Perl quản trị hệ thống Internet: Duy trì hệ thống UNIX Viết ứng dụng CGI để tạo trang Web động Quản lý e-mail Tự động trì trang Web Một điều quan trọng, Perl chương trình miễn phí, không cần phải có giấy phép tiền quyền Dù trình thông dịch Perl chạy hỗ trợ nhiều khác UNIX, Windows, Mac OS 2.Cài đặt sử dụng Perl 2.1.Đối với UNIX -Tải xuống mã nguồn phân phối chuẩn từ http://www.perl.com/ pub/language/info/ software.html -Giải nén tệp lệnh gzip – d stable.tar.gz , để lại tệp có tên stable.tar -Untar tệp cách sử dụng lệnh tar – xvfstable.tar, tạo thư mục có tên perl 5.6.0 (Nếu bạn cài đặt phiên tên thư mục khác.) -Đặt cấu hình cài đặt: tuỳ thuộc vào cách bạn thực việc cài đặt hệ thống mà bạn làm việc, trả lời câu hỏi mà bạn muốn cài đặt thông dịch Perl -Sau hoàn tất phần cấu hình tiến trình cài đặt, bạn thấy hình thông báo -Sau thực xong tác vụ, bạn nên kiểm tra lại trước thực hoàn tất tiến trình cài đặt Để thực việc kiểm tra, dùng lệnh make test Một hình thông báo -Dùng lệnh make install để hoàn tất tiến trình cài đặt 2.2.Đối với hệ điều hành Windows -Tải phần mềm địa http:// www.activestate.com/Products/ ActivePerl/ Download.html -Nhấp đúp vào file để khởi động chương trình cài đặt -Chọn tuỳ chọn chấp nhận đồng ý cấp phép sau chọn Next -Hộp thoại Setup options cho phép bạn chọn tuỳ chọn xác lập mà bàn muốn cấu hình Tuy nhiên, có lời khuyên bạn nên để chế độ mặc định (Default) -Khi tiến trình cài đặt hoàn tất, bạn nhìn thấy hình cuối Chọn Finish để đóng chương trình cài đặt Giờ đây, sau cài đặt xong Perl hệ thống bạn, chạy thử chương trình nhỏ sau đây: Dùng phần mềm cho phép tạo file text, windows notepad gõ vào dòng chữ sau: Print “Perl thật hay!”; Nếu bạn chạy UNIX, thêm dòng #!/usr/bin/perl vào đầu tiên: #!/usr/bin/perl print “Perl thật hay!”; Sau dùng Perl để dịch bạn thấy hình dòng chữ : Perl thật hay! Hãy thử so sánh với chương trình C: void main (){ printf (“Perl thật hay”); getch() } Rõ ràng Perl hiệu hơn! Các yếu tố Perl 3.1.Từ vựng Perl * Tập kí tự - 26 chữ hoa (A-Z) 26 chữ thường (a-z) - 10 chữ số ( 0-9) - Các ký hiệu toán - Các dấu ngăn cách - Các ký hiệu khác @, $, %, * Định danh - Là dãy kí tự gồm chữ số dấu _, ký tự đầu số - Chú ý : Trong Perl phân biệt chữ hoa chữ thường 3.2.Các từ khoá Perl Perl có nhiều từ khoá: Break, for, foreach, do, else, if, 3.3.Cách viết thích: Tất thích đặt sau dấu # Perl không dịch gặp dấu kết thúc dòng Các thích hợp lý làm cho chương trình bạn dễ đọc dễ hiểu Bài tập: Bạn cài đặt Perl máy chạy thử chương trình nhỏ Chương 2: Các kiểu liệu 1.Kiểu Vô Hướng 1.1 Định Nghĩa: Kiểu vô hướng kiểu liệu đơn giản PERL Nó số xâu Chú ý: Kiểu vô hướng không bị giới hạn nhớ cấp phát 1.2 Khai báo biến vô hướng : Một biến vô hướng bắt đầu kí tự “ $ ” sau tên biến VD : $number=5; $string= “Hello,everybody”; Chú ý : Trong PERL có phân biệt chữ hoa chữ thường VD : $abc, $Abc, $ABC, $ABc biến khác 1.3 Cách biểu diễn : * Số : - Trong PERL không phân biệt số nguyên số thực Tất số coi có kiểu dấu chấm động có độ chuẩn xác gấp đôi - Có thể biểu diễn thông thường sử dụng kí pháp khoa học VD : $s=2.32; $s=5.2E5; - Để biểu diễn số hệ thập lục phân hệ bát phân ta thêm tiền tố 0x trước giá trị VD : $ hexa = 0x52; # $ hexa = 82; $ octa = 010; # $octa = 8; * Xâu kí tự : - Xâu chuỗi kí tự , kí tự có giá trị bít bảng mã ASCII - Có cách biểu diễn xâu : + Xâu đặt ‘ ‘ : In nguyên (không kể space ,tab không phân biệt kí tự điều khiển ) toàn nội dung xâu VD : print ‘\n’; # in \n thay xuống dòng Chú ý : trường hợp đặc biệt + print ‘\’’; # in ‘ + print ‘\\’; # in \ + Xâu đặt “ “ : Nó tương tự xâu C, có phân biệt kí tự điều khiển VD : print “Nhóm X \n Lớp Tin5 “; # Nhóm X Lớp Tin5 Bảng Các kí tự điều khiển Kết cấu \n \r \t \f \b \a \e \007 \0x7f \cC \\ \" \l \L \u \U \E Ý nghĩa xuống dòng đầu dòng ký tự tab báo hết trang xoá lui ký tự phát tiếng "bíp" escape ký tự ASCII hệ tám (007=bíp) ký tự ASCII hệ mười sáu (7f=delete) ký tự điều khiển (ở Ctrl-C) dấu sổ chéo ngược dấu nháy kép ký tự chuyển thành chữ thường tất ký tự \E thành chữ thường ký tự chuyển thành chữ hoa tất ký tự \E thành chữ hoa kết thúc \L hay \U Chú ý : Trong xâu có xen lẫn biến VD : $a=5; print “ Trong nhóm có $a người “; # in nhóm có người 1.4 Các toán tử * Các toán tử cho số : + , - , * , / , % ( Giống C Pascal ) ** ( Tính luỹ thừa C Pascal ) ++ , (cách sử dụng giống C có phân biệt thứ tự trước sau ) VD : $b=2**3; #$b=8 $a=++$b; #$a=9,$b=9 $a=$b++; #$a=8,$b=9 * Các toán tử cho xâu : + ‘ ’ : Nối xâu Các xâu thành phần không bị thay đổi VD : $str1=”Lớp ”; $str2=”Tin 5”; $str=$str1.$str2; + ‘x’ : Lặp lại xâu #$str=”Lớp Tin “ VD : $str=”Tin ” x #$str=”Tin Tin Tin5” + Chop( ) : Bỏ kí tự cuối xâu VD : $str=”Tin 5”; chop($str); #str=”Tin “ + Chomp( ) : Chỉ bỏ kí tự xuống dòng cuối xâu VD : $str=”abc\n”; chomp($str); #str=”abc” $str=”Tin5”; chomp($str); #str=”Tin5” Chú ý :Perl tự đông chuyển đổi xâu số tùy theo ngữ cảnh VD : $a = 2; $b = 6; $c = $a.$b; #$c =”26”; $d = $c/2; #$d = 13; $e = “asad”; $s = $a + $e; #$s = 2; Bảng so sánh số xâu Phép so sánh Bằng Không Bé Lớn Bé hay Lớn hay Số == != < > = Xâu eq ne lt gt le ge 1.5 Vào biến vô hướng Vào $s = ; Ra print $s; 2.Mảng 2.1 Định nghĩa Là danh sách có thứ tự liệu vô hướng phần tử mảng biến vô hướng tách biệt với giá trị độc lập Các giá trị xếp theo thứ tự Chú ý : Mảng có độ lớn ,có thể lấp toàn bộ nhớ 2.2 Khai báo Biến mảng khai báo bắt đầu kí tự @ sau tên biến VD : @array = (‘a’,’b’,’c’); @ad = (123,’sdf ‘,12); Chú ý : Một biểu thức sử dụng biến mảng cách chọn vẹn 2.3 Biểu diễn truy nhập vào phần tử mảng - Mảng kí hiệu : VD : (‘a’,5,’sdfs’); ( ); # Mảng rỗng - Cách biểu diễn mảng : @name=(mảnghằng ); VD : @abc = (123,’sdfsa’,’23’); Chú ý : Trong PERL mảng nhiều chiều VD : @a=(1,2,3); @b=(1,”abc”,@a); # @b=(1,”abc “,1,2,3); - Cách truy nhập mảng : Các phần tử mảng truy nhập theo số tương tự C Mảng đánh số từ phần tử có số tăng lên VD : @a = (1,2,3); $b = $a[0]; #$b=1; Ở dùng kí tự $ @ truy nhập vào phần tử kiểu vô hướng Chú ý : +Khi truy nhập vào mảng với số lớn số mảng biến không xác định +Khi truy nhập vào danh sách phần tử từ mảng gọi lát cắt VD : @a=(0,1,2,3); @a[0,1]=@a[1,0]; # Đảo phần tử a[0] a[1] cho Lát cắt dùng tiền tố @ không $ dùng lát cắt ta tạo biến mảng việc chọn số phần tử mảng biến vô hướng Lát cắt làm việc danh sách kí hiệu ,hay toán tử cho lại giá trị VD : @a=(1,2,3,4,5) [2,3]; # @a=(3,4) 2.4 Hàm toán tử cở * Phép gáp VD : @a=(1,2,3); - Có thể gán mảng cho VD : @Copy_a= @a; #@Copy_a=(1,2,3); @b=(@a,3,5,6); #@b=(1,2,3,3,5,6); - Có thể gán giá trị vô hướng cho mảng Khi mảng có thành phần VD : @array=1; # array=(1) - Có thể dùng phép gán để hoán vị phần tử ,thêm bớt phần tử mảng … Chú ý : Trong phép gán mảng mảng + Nếu số phần tử biến mảng lớn số phần tử mảng biến mảng thừa giá trị xác định VD : @a=(1,2,3); ($a[0],$a[1],$a[2])=(4,5); # @a=(4,5) $a[2] khong xác định + Nếu số phần tử biến mảng nhỏ số phần tử mảng phần tử thừa mảng bị cắt VD : ($a[0],$a[1],$a[2])=(1,2,”asd”,3); # @a=(1,2,”asd”) *Hàm - push() pop() - shift() unshift() - reverse() - sort() VD : @a=(1,2,4); push(@a,3); # @a=(1,2,4,3) $b=pop(@a); #$b=3, @a(1,2,4) 2.5 Vào Vào : Dùng @a= muốn kết thúc vào mảng bấm ^Z hay F6 (trong DOS ) Ra : print @a; VD : @a=(1,2,3); print @a; #123 3.Mảng Liên Kết 3.1Định Nghĩa Mảng liên kết mảng gồm biến vô hướng khóa tương ứng để truy xuất đến biến 3.2 Khai báo Biến mảng liên kết khai báo bắt đầu kí tư % sau tên mảng liên kết VD : %tin5 3.3 Biểu diễn - Tạo mảng liên kết %name=(‘key1’,gt1,’key2’,gt2,’key3’,gt3, ); key : biểu thức vô hướng VD : %tin5=(1,”hoa”,2,”tan”,3,”tung”); - Khi truy nhập vào phần tử mảng dùng từ khoá thay cho số mảng thông thường VD : $a=$tin5{1}; #$a=1; - Trong mảng liên kết truy nhập thông qua danh sách khoá để đưa danh sách giá trị tương ứng VD : @a=$tin5{1,2} #@a=(1,2); 3.4 Toán tử hàm + Mảng liên kết mảng nên sử dụng tất cácphép toán , toán tử hàm mảng + Các toán tử khác - keys(%name) : liệt kê tất từ khóa mảng liên kết Giá trị trả mảng VD : @name=keys(%tin5); #@name=(1,2,3); - values(%name) : liệt kê tất giá trị mảng liên kết Giá trị trả mảng VD : @name=values(%tin5); #@name=(“hoa”,”tan”,”tung”); - delete : Loại bỏ phần tử mảng liên kết (xóa từ khóa giá trị tương ứng) VD : delete $tin5{1}; # Xóa “hoa” khỏi mảng Câu Hỏi ôn tập : Kiểu vô hướng ? Có phép toán cho kiểu số nguyên không ? Nêu số toán tử PERL mà Pascal C Lấy ví dụ cho toán tử nêu Cuối xâu có kí tự đặc biệt không ? Có thể nối lúc nhiều xâu với hay không ? Nếu có lấy ví dụ minh họa Lấy ví dụ chuyển đổi xâu sang số ngược lại ? Kiểu mảng ? Trong PERL có mảng nhiều chiều hay không ? Tại truy nhập vào phần tử mảng lại dùng kí tự $ kí @? Khi truy nhập vào mảng với số lớn số mảng xảy tượng ? Khi , perl thực chương trình viết my_prog.pl , lấy liệu từ in_file.txt ( thay từ bàn phím ) , xuất liệu out_file.txt (thay hình) Bên cạnh STDIN , STDOUT , Perl có điều khiển file chuẩn STDERR giúp cho việc thông báo lỗi hình trường hợp thiết bị chuẩn bị thay đổi print STDERR (“ File opened successfully \n”); 2.4.Đóng file : Sau ta hoàn thành việc đọc hay ghi từ file, để đóng file ta dùng hàm close() : close (điều_khiển_file); Tuy nhiên ta không thiết phải đóng file , Perl tự động đóng file chương trình kết thúc tên điều khiển file lại sử dụng để mở file khác : open (MYFILE, ">file1"); print MYFILE ("Here is a line of output.\n"); open (MYFILE, ">file2"); print MYFILE ("Here is another line of output.\n"); 2.5.Đọc từ nhiều file – toán tử - mảng @ARGV: Ta có file Test.pl , test1.pl , test2.pl với nội dung: # file Test.pl While ($line= ) { print($line); } # file Test1.pl While () { print(); } # file Test2.pl While () { print(); } Trong DOS , thực lệnh: perl –w test.pl tes1.pl test2.pl Khi hình in nội dung file test1.pl , test2.pl Theo ví dụ ta thấy , điều khiển file thực lệnh : perl –w test.pl tes1.pl test2.pl file test1.pl , test2.pl đọc Quá trình đọc sau: đọc hết dòng file test1.pl , sau đọc sang file test2.pl Đọc file vào mảng : Trong ví dụ ta thay $line @array , : @array= ; đọc toàn nội dung file vào mảng @array Sự tưong quan toán tử mảng @ARGV : Nếu điều khiển Perl kiểm tra mảng @ARGV.Nếu mảng @ARGV phần tử , đọc từ STDIN bàn phím hay từ file vào chuẩn đổi perl –w test.pl tes1.pl test2.pl Perl tạo mảng @ARGV từ dòng lệnh , file dòng lệnh ( phía sau tên chương trình test.pl ) đọc vào @ARGV: @AGRV= ( “test1.pl “ , “test2.pl”); 1.Khi chương trình thi hành lần , vị trí toán tử mở file chứa @AGRV[0] 2.Sau mở file , trình biên dich thực hàm : shift(@AGRV); 3.Tiếp đến toán tử đọc dòng file mở bước 4.Khi toàn file đọc xong , trình biên dịch quay trở lại bước , tiếp tục trình hết phần tử @ARGV 3.Các hàm file: Tên hàm Mô tả binmode(FILE_HANDLE) Chuyển file tham khảo FILE_HANDLE sang chế độ nhị phân (Binary Mode ) chdir(DIR_NAME) Thay đổi thư mục DIR_NAME Hàm trả lại giá trị True thay đổi thành công , ngược lại False close(FILE_HANDLE) Đóng file (đang mở ) tham khảo FILE_HANDLE Closedir(DIR_HANDLE) Đóng thư mục mở tham khảo DIR_HANDLE eof(FILE_HANDLE) Trả lại giá trị True gặp dấu hiệu kết thúc file file không mở getc(FILE_HANDLE) Đọc kí tự từ FILE_HANDLE, FILE_HANDLE chưa tham khảo đến file , kí tự từ STDIN đọc Glob(EXPRESSION) Trả lại danh sách file phù hợp với thông số biểu thức EXPRESSION Chẳng hạn glob(“*.pl”) trả lại danh sách chương trình Perl thư mục lstat(FILE_HANDLE_OR_ FiLE_NAME) Trả lại thông tin file chứa mảng 13 phần tử mkdir(DIR_NAME, MODE) Tạo thư mục có tên DIR_NAME Nếu muốn tạo thư mục thư mục mẹ phải tồn trước đó.Hàm trả lại giá trị False nêu thư mục không tạo Biến đặc biệt $! gán thông báo lỗi open(FILE_HANDLE,FILE_NAME) Mở file FILE_NAME đồng thời FILE_HANDLE tham khảo đến file Tạo tham khảo DIR_HANDLE thư opendir(DIR_HANDLE, DIR_NAME) mục có tên DIR_NAME.Trả lại True thành công, ngược lại False print FILE_HANDLE (LIST) Gửi thông tin chứa LIST tới FILE_HANDLE, FILE_HANDLE STDOUT sử dụng printf FILE_HANDLE (FORMAT, LIST) Gửi thông xâu chứa LIST theo định dạng FORMAT tới FILE_HANDLE STDOUT dùng FILE_HANDLE read(FILE_HANDLE, BUFFER, LENGTH,LENGTH OFFSET) Đọc LENGTH byte từ FILE_HANDLE vị trí OFFSET vào biến vô hướng BUFFER.Trả lại số byte đọc hay không xác định readdir(DIR_HANDLE) Đọc thư mục từ DIR_HANDLE rename(OLD_FILE_NAME, NEW_FILE_NAME) Thay đổi tên file rewinddir(DIR_HANDLE) Resets DIR_HANDLE readdir bắt đầu đọc từ thư mục rmdir(DIR_NAME) Xóa thư mục trống DIR_NAME Thông báo lỗi gán vào $! Biến $ dùng không DIR_NAME seek(FILE_HANDLE, POSITION, WHENCE) Di chuyển tới vị trí POSITION file tham khảo FILE_HANDLE.Tham số WHENCE =0 đầu file , =1 vị trí , =2 điểm kết thúc file Sets the current position for readdir() POSITION must be a value returned by the seekdir(DIR_HANDLE, POSITION) telldir() fuNCtion Đặt vị trí cho readdir() POSITION phải giá trị trả lại hàm telldir() select(FILE_HANDLE) Đặt mặc định cho thiết bị FILE_HANDLE.Trả lại giá trị điều khiển file để dùng đến cần sprintf(FORMAT, LIST) Trả lại chuỗi kí tự định dạng FORMAT stat(FILE_HANDLE_OR_ FILE_NAME) Trả lại thông số file mảng 13 phần tử sysread(FILE_HANDLE, BUFFER, LENGTH, OFFSET) Đọc LENGTH byte từ FILE_HANDLE OFFSET vào biến vô hướng BUFFER syswrite(FILE_HANDLE, LENGTH, OFFSET) Ghi LENGTH byte từ BUFFER vào FILE_HANDLE từ vị trí OFFSET Trả lại số byte ghi không xác định BUFFER, tell(FILE_HANDLE) Trả lại vị trí file FILE_HANDLE telldir(DIR_HANDLE) Trả lại vị trí DIR_HANDLE.Giá trị trả lại truyền cho seekdir() Truncate(FILE_HANDLE, LENGTH) Cắt cụt file FILE_HANDLE độ dài LENGTH byte unlink(FILE_LIST) Xóa danh sách file FILE_LIST write(FILE_HANDLE) Ghi vào file FILE_HANDLE Các cách mở file hàm open(): Cú pháp Mô tả open(FILE_HANDLE); Mở file cho phép vào liệu open(FILE_HANDLE, FILENAME.EXT); Mở file cho phép vào liệu open(FILE_HANDLE, +FILENAME.EXT); Mở file để ghi open(FILE_HANDLE, -); Mở file vào chuẩn open(FILE_HANDLE, >-); Mở file chuẩn open(FILE_HANDLE, >>FILENAME.EXT); Mở file thêm nội dung vào cuối file open(FILE_HANDLE, +FILENAME.EXT); Mở file cho phép vào liệu open(FILE_HANDLE, +>>FILENAME.EXT); Mở file cho phép vào liệu (vào cuối file) open(FILE_HANDLE, | PROGRAM) Gủi liệu từ FILE_HANDLE tới chương trình khác open(FILE_HANDLE, PROGRAM |) Đọc liệu từ chương trình khác sử dụng FILE_HANDLE 3.1.Xử lý file chế độ văn ( Text Mode) nhị phân (Binary Mode): Ở phần ( 1.Giới thiệu – Các thông tin tệp ) ta phân biệt chế độ văn chế độ nhị phân.Trong mục ta làm rõ nội dung nêu Chế độ mặc định chế độ văn ( Text mode ) 3.1.1.Đọc file văn bản: Có file Binary.dat có nội dung sau: 01 02 03 Đọc chế độ text mode ( mặc định ) $buffer=””; open (file,”>binary.dat”); read(file,$buffer,20,0); # Đọc 20byte từ vị trí vào $buffer close(file); foreach (split(//,$buffer)) { printf (“%02x”,ord($_)); # in mã ASCII của $_ ở hệ 16 print “\n” if $_ eq “\n” ; # xuống dòng nếu đọc đến kí tự kết thúc dòng } Trên hình : 30 30 30 31 0a 32 0a 33 0a Chú ý: Hàm split(//, string) :trả lại giá trị mảng mà thành phần kí tự xâu Hàm ord($_) : in mã ASCII ( theo số 10) của kí tự chứa bởi biến $_ Hàm printf () : giống hàm printf C , hàm này cũng in đối số theo định dạng (Ta sẽ xét tới hàm này kỹ ở phần sau) Như vậy màn hình hiện mã ASCII của các kí tự file binary.dat : 30 hex ( Dec) , 31 hex ( Dec ) , 32 hex ( Dec ) , 33 hex ( Dec) , 0a hex ( 10 Dec ) Kí tự kết thúc dòng được biểu diễn bởi kí tự có mã 0a Đọc chế độ binary mode: $buffer=””; open (file,”>binary.dat”); binmode(file); # Chuyển sang chế độ nhị phân read(file,$buffer,20,0); # Đọc 20byte từ vị trí vào $buffer close(file); foreach (split(//,$buffer)) { printf (“%02x”,ord($_)); # in mã ASCII của $_ ở hệ 16 print “\n” if $_ eq “\n” ; # xuống dòng nếu đọc đến kí tự kết thúc dòng } Màn hình: 30 30 30 31 32 33 0d 0d 0d 0a 0a 0a Như từ lần đọc chế độ văn chế độ nhị phân, ta nhận thấy chế độ văn kí tự kết thúc dòng biểu diễn kí tự có mã theo hệ thập lục phân 0a (tương đương 10 hệ thập phân) Còn chế độ nhị phân, chế độ kết thúc dòng biểu diễn cặp kí tự có mã theo hệ 16 0d 0a (13-10 hệ 10) 3.1.2.File nhị phân: Có file eof.dat nội dung: 01 02 03 Đọc chế độ văn bản : $buffer=””; open (file,”>eof.dat”); read(file,$buffer,20,0); # Đọc 20byte từ vị trí vào $buffer close(file); foreach (split(//,$buffer)) { printf (“%02x”,ord($_)); # in mã ASCII của $_ ở hệ 16 print “\n” if $_ eq “\n” ; # xuống dòng nếu đọc đến kí tự kết thúc dòng } Màn hình: 30 30 31 32 0d 0d 0a 0a Như file nhị phân chế độ văn hiển thị kí tự kết thúc dòng Ngoài đọc chế độ văn bản, ta không đọc 03, Đó chế độ văn gặp kí tự kết thúc file (mã ASCII 26) chương trình dừng lại Đọc chế độ nhị phân: $buffer=””; open (file,”>eof.dat”); binmode(file); read(file,$buffer,20,0); # Đọc 20byte từ vị trí vào $buffer close(file); foreach (split(//,$buffer)){ printf (“%02x”,ord($_)); # in mã ASCII của $_ ở hệ 16 print “\n” if $_ eq “\n” ; # xuống dòng nếu đọc đến kí tự kết thúc dòng } Màn hình: 30 30 1a 31 32 30 0d 0d 33 0a 0a 0d 0a Rõ ràng chế độ nhị phân, gặp kí tự kết thúc file chương trình tiếp tục đọc Nó coi kí tự kết thúc file kí tự khác in 3.2.Hàm printf định dạng: Định dạng Miêu tả c Chỉ kí tự in s Một xâu kí tự in d Một số hệ thập phân in u Một số thập phân không dấu in x Một số thập lục phân in o Một số hệ bát phân in e Một số dấu chấm động in với kí pháp khoa học (e) f Một số dấu chấm động in g Indicates that a floating point number should be printed using the most space-spacing format, either e or f Định dạng Miêu tả - In lề trái # Số thập lục phân in sau 0x Số bát phân in sau + Số có dấu in sau dấu + - Pads the displayed number with zeros instead of spaces Tất gía trị in với độ rộng định Ví dụ %10.3f giá trị in có độ rộng tối thiểu 10, tối đa vị trí sau dấu ‘.’ %10s In xâu với độ dài tối đa 10 kí tự 4.Các toán tử kiểm tra file Trước mở file để đọc để thêm nội dung ta cần phải kiểm tra tồn file, xem file có phép ghi hay không Nếu file không tồn có lỗi xảy Như việc kiểm tra thuộc tính file quan trọng trước vào thao tác xử lý file Perl cho ta công cụ toán tử kiểm tra để làm điều Sử dụng toán tử kiểm tra đơn giản theo cú pháp: toán_tử toán_hang; Ví dụ : -e file_handle; # kiểm tra xem file có tồn tại hay không Bảng toán tử kiểm tra: Toán tử Ý nghĩa -d Kiểm tra file có phải thư mục? -e Kiểm tra tồn file -f Tên file thông thường? -r Kiểm tra file đọc? -s File không rỗng? -t Does name represent a terminal? -u Does name have its setuid bit set? -w File ghi được? -x File có phải file thi hành không (.exe, com ) -z File có file rỗng? -A Trả lại quãng thời gian từ file truy nhập lần cuối -B File có phải file nhị phân? -M Thời gian từ file thay đổi lần cuối -T Đây có phải file text? Chương :Các biểu thức quy tắc Định nghĩa Biểu thức quy tắc quy luật miêu tả mẫu kí tự tìm thấy file text xâu kí tự Quy luật gọi mẫu Đây công cụ hiệu để xử lý kí tự Ví dụ, bob*y biểu thức quy tắc phù hợp với boy hay bobby không phù hợp với booy Điều nói rõ phần sau Cách sử dụng Có thể sử dụng biểu thức quy tắc toán tử =~ để tìm xem mẫu có xâu kí tự? $result = $variable =~/pattern/; Biến result có giá trị true mẫu pattern tìm thấy variable Cũng sử dụng toán tử !~ để xem mẫu xâu kí tự ? #Một ví dụ đơn giản $input = ; chop($input); print “Happy found!” if ($input =~/happy/); #In “Happy found!” tìm thấy mẫu happy xâu kí tự vào từ bàn phím Các kí tự đặc biệt Các kí tự đặc biệt dùng biểu thức quy tắc: Kí tự [] * + ? {n} {n, } {n,m} ^ $ \b \B \d \D \s Ý nghĩa Phù hợp với kí tự Bất kí tự nằm dấu ngoặc vuông nhiều kí tự trước nhiều kí tự trước kí tự trước Kí tự trước xuất n lần Kí tự trước xuất n lần Kí tự trước xuất n lần, nhiều m lần Bắt đầu xâu kí tự Kết thúc xâu kí tự Ngăn cách từ Không ngăn cách từ Chữ số Không phải chữ số Kí tự space Ví dụ Phù hợp b.b b[oea]d bob bod,bed,bad Không phù hợp bb bcd bob*y bob+y bob+y bob{2}y bob{1, }y boy,boby,bobby boby,bobby boy,boby bobby boby,bobby booy boy bobby boby booy bob{2,3}y bobby bobbbby ^fool $fool Be\bside Be\Bside B\db B\Db B\sb foolish Aprilfool Be side Beside B4b Bdb Bb Aprilfool foolish Beside Be side Bdb B4b Bsb \S \w \W Không phải kí tự space Kí tự chữ số Không phải kí tự chữ số B\Sb A\ws A\Ws Bb Abs A#s Bb A^s Abs Thay đổi mẫu mẫu khác * Dùng cấu trúc s///: VD: $house = “henhouse”; $house = ~ s/hen/dog/; #Lúc house có giá trị doghouse Chú ý: +Cấu trúc s/// thay đổi lần gặp mẫu VD: $a=”asabas”; $a=~ s/as/ab/; #$a=”ababas”; +Chúng ta thay đổi giá trị xâu kí tự (henhouse) Thay vào đó, phải lưu trữ dạng biến thay đổi giá trị biến * Dung cấu trúc tr//: Nó dùng để thây đổi kí tự riêng lẻ ,nó bao gồm phấn giống : tr/a/b thay đổi tất kí tự a thành kí t ự b VD: $a =”aaabbbccc”; $a = ~ tr/a/A; #$a=”AAAbbbccc”; Chú ý: Khi ta muốn thay đổi số lớn kí tự ta cần quan tâm đến vị trí xếp kí tự, số lượng kí tự hai phần để tránh sai.Nếu số lượng kí tự phần thứ nhiều kí tự phần thứ kí tự phần hai phần gọi cấu trúc str// thay kí tự phần mà vị trí nhỏ độ dài kí tự phần hai VD: $a = “abcdefabcdef”; Nếu $a= ~ tr/abc/AB #$a=”ABcdefABcdef” Nếu $a = ~tr/de/DEF #$a=”abcDEfabcDEf” Cấu trúc hay sử dụng để chuyển kí tự viết thường xâu thành chữ hoa ngược lại #Đổi kí tự thành chữ hoa while ($string = ) { $string =~ tr/a-z/A-Z; print “$string”; } Bài tập: 1.Lập chương trình tìm kiếm tất xâu kí tự ngày tuần file text có sẵn 2.Lập chương trình thay kí tự viết hoa thành chữ thường xâu nhập vào từ bàn phím in xâu sau chuyển đổi Chương 8: Tham chiếu Chương giới thiệu tham chiếu (reference), cách sử dụng tham chiếu đến hàm trả giá trị từ hàm 1.Giới thiệu tham chiếu Tham chiếu (reference) trỏ trỏ đến giá trị, tương tự trỏ C hay Pascal Giá trị trỏ đến có kiểu vô hướng, kiểu mảng, kiểu mảng thường hay chí hàm Cách sử dụng tham chiếu: -$$pointer: Con trỏ trỏ đến biến vô hướng -@$pointer: Con trỏ trỏ đến mảng -%$pointer:Con trỏ trỏ đến mảng liên kết Toán tử backslash ‘ \ ‘ Dùng toán tử ‘\’ tương tự toán tử ‘&’ để lấy địa biến Cách tạo tham chiếu đến giá trị vô hướng: $value = 22; $pointer = \ $value; Bây giờ, biến $pointer biến vô hướng có giá trị địa biến $value Ngay biến $value bị thay đổi, ta truy nhập đến giá trị cũ thông qua $pointer cách :$$pointer $$pointer $value có ý nghĩa $value = 10; $pointer = \$value; print “\n Pointer address $pointer of $value”; print “\n Pointer address $pointer of $$pointer”; Trên hình dòng chữ như: Pointer address SCALAR 0x860 of 10 Pointer address SCALAR 0x860 of 10 Tham chiếu mảng Tất mảng Perl (cả @ %) mảng chiều, thành phần mảng giá trị vô hướng, mảng khác hay cấu trúc Cũng dùng tham chiếu đến mảng biến vô hướng: $pointer = \@array; #Sử dụng $pointer mảng array print “ \nPointer Address of array = $pointer”; $i = scalar (@$pointer); print “\n Number of arguments : $i”; $i = 0; foreach (@$pointer) { print “\n $i : $$pointer[i++]”; } Toán tử ‘\’ sử dụng với mảng liên kết %week = ( ‘01’ , ’Sun’, ’02’ , ‘Mon’, ‘03’ , ‘Tue’, ‘04’ , ‘Wed’, ‘05’ , ‘Thu’, ‘06’ , ‘Fri’, ‘07’ , ‘Sat’,); $pointer = \%week; print “\nAddress of Accociate Array : $pointer”; foreach $i (key %$pointer) { print “$i is $$pointer{$i}”; } Cũng dùng toán tử ‘=>’ thay cho dấu ‘,’ mảng liên kết, làm cho chương trình dễ đọc hơn: %week = (‘01’ => ‘Sun’, ‘02’ => ‘Mon’, ‘03’ =>’Tue’, ‘04’ => ‘Wed’, ‘05’ => ‘Thu’, ‘06’ => ‘Fri’, ‘07’ => ‘Sat’,); Nhưng truy xuất đến phần tử mảng liên kết, phải dùng cấu trúc $ $pointer{3} : $$pointer ->{3} Sử dụng mảng nhiều chiều Để tạo mảng nhiều chiều, ta sử dụng cấu trúc: $line = [ ‘a’, ‘b’, [1,2,3], [4,5,6] ]; Lúc mảng tạo có phần tử Hai phần tử đầu hai giá trị vô hướng, hai giá trị sau hai mảng Để lấy giá trị phần tử mảng nhỏ bên trong: $Thamchieumang->[Chiso1] $Thamchieumang->[Chiso1] [Chiso2] $Thamchieumang->[Chiso1] [Chiso2] #Cho mảng chiều #Cho mảng hai chiều #Cho mảng ba chiều Ví dụ: $array = [‘a’ , ‘b’, [1, 2, 3], [4, 5, 6] ]; print “\$line[0]->$line->[0]\n”; print “\$line[1]->$line->[1]\n”; print “\$line[2][0]->$line->[2][0]\n”; print “\$line[2][1]->$line->[2][1]\n”; print “\$line[2][2]->$line->[2][2]\n”; print “\$line[3][0]->$line->[3][0]\n”; print “\$line[3][1]->$line->[3][1]\n”; print “\$line[3][2]->$line->[3][2]\n”; Kết : $line[0]->a $line[1]->b $line[2][0]->1 $line[2][1]->2 $line[2][2]->3 $line[3][0]->4 $line[3][1]->5 $line[3][2]->6 Cũng tiến hành tương tự mảng liên kết 5.Tham chiếu đến chương trình (subroutine) Để tạo tham chiếu đến chươn trình con, sử dụng miêu tả: $pointer_to_sub = sub {Các tham số chương trình con}; Gọi chương trình tham chiếu đến: &$pointer_to_sub(Các tham số); Ví dụ: sub pr { my($x,$y,$z)=@_; print "$x $y $z"; return $x; } $k = 1; $j = 2; $m = 4; $this = pr($k,$j,$m); #$this tới hàm pr(1,2,4) $that = pr(4,5,6); #$that tới hàm pr(4,5,6) #$this #that hai tham chiếu đến hai hàm khác Hàm có tham số nhiều mảng Khi đưa tham số vào hàm nhiều mảng biến đặc biệt @_ : My(@a,@b)=@_ Perl gộp tất mảng @_ thành mảng Vì vậy, khai báo trên, có mảng @a có giá trị, @b mảng rỗng Ta đưa tham số vào hàm nhiều mảng cách sử dụng tham chiếu @name = ('mickey','knoopy','Pooh'); @phone = (111,222,333); $i = 0; sub listem { my ($a,$b) = @_; foreach (@$a) { print "a[$i] = ".@$a[$i]."\tb[$i]=".@$b[$i]."\n"; $i++; } } &listem(\@name,\@phone); Lúc này, tham số đưa vào hàm biến vô hướng (có giá trị địa mảng) Mục lục Chương 1: Tổng quan .1 1.Lịch sử phát triển 2.Cài đặt sử dụng Perl 3.Các yếu tố Perl Chương 2: Các kiểu liệu 1.Kiểu vô hướng 2.Mảng 3.Mảng liên kết .8 Chương 3: Toán tử hàm có sẵn 11 1.Toán tử .11 1.1.Toán tử cho số 11 1.2.Toán tử cho xâu 12 1.3.Các toán tử so sánh số xâu 12 1.4.Các toán tử thao tác bit .14 1.5.Toán tử logic 14 1.6.Các toán tử đặc biệt 15 1.7.Trật tự ưu tiên toán tử 16 Chương 4: Các câu lệnh điều khiển vòng lặp .18 1.Khối câu lệnh .18 2.Câu lệnh if/unless .18 3.Vòng lặp while/until 20 4.Câu lệnh vòng lặp không xác định 20 5.Câu lệnh {} while/until .21 6.Vòng lặp for .21 7.Câu lệnh foreach 22 8.Các câu lệnh nhảy 23 Chương 5: Hàm .27 1.Định nghĩa 27 2.Khởi tạo 27 3.Gọi hàm 28 4.Giá trị trả hàm .29 5.Truyền tham số cho hàm 30 Chương 6: File thao tác vào .36 1.Giới thiệu 36 2.Các thao tác với file 36 3.Các hàm file 39 4.Các toán tử kiểm tra file 45 Chương 7: Các biểu thức quy tắc 46 Chương 8: Tham chiếu 48 Phụ lục : Bài tập nộp……………………………………………………………….49 [...]... không) 1.3 .Các toán tử so sánh cho số và xâu 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 các bảng Tại sao phải phân biệt số và xâu như vậy nếu như Perl cho tự chuyển từ đổi giữa số và xâu? 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... đó là bé hơn Cho nên Perl đòi hỏi bạn xác định đúng kiểu so sánh Để hiểu rõ hơn về các phép so sánh, ta hãy xét các bảng sau: Các toán tử so sánh liên quan đến số: Toán tử Ý nghĩa The Equality Operators op1 == op2 Phép toán trả về giá trị true nếu op1 bằng op2 Ví dụ: 6 == 6 là true op1 != op2 Phép toán trả về giá trị true nếu op1 không bằng op2 Ví dụ: 6 != 7 là true Phép toán so sánh op1 < op2 Op1 > op2 Dịch phải, bỏ đi những bit bên phải và đặt cho bit bên trái nhận giá trị 0 Mọi phép dịch phải tương đương với chia op1 cho 2 mũ op2 Op1