Câu hỏi thường gặp về ngôn ngữ Perl cho người mới bắt đầu. Ngôn ngữ lập trình mới: lý do cho sự xuất hiện

Bạn sắp bước vào thế giới lập trình Perl. Hành trình của bạn sẽ thú vị hơn rất nhiều vì có sự hiện diện của một số lượng lớn các ví dụ sẽ xuất hiện trên đường đi. Sự khởi đầu của cuộc hành trình của chúng tôi bao gồm các khái niệm cơ bản của ngôn ngữ. Dần dần, bạn sẽ học đủ về Perl để viết các chương trình nhỏ. Khi kết thúc hành trình của chúng tôi, bạn sẽ có kho kiến ​​​​thức cần thiết để có thể tạo các ứng dụng chính thức.

Bạn có nói ngôn ngữ lập trình nào khác không? Nếu có, thì việc học Perl sẽ chỉ là một thú vui đối với bạn. Nếu không, hãy dành thời gian của bạn, thử tất cả các bài tập và ví dụ được đề xuất, và đừng ngại thử nghiệm!

Nguồn gốc

Perl ra đời là kết quả công việc của một người, và do chính anh ta thừa nhận, là kết quả của sự lười biếng của anh ta. Cái này - ngôn ngữ độc đáo, bản chất của nó không thể được truyền đạt mô tả đơn giản chi tiết kỹ thuật. Perl là một trạng thái của tâm trí.

Một trong những điều kỳ quặc của ngôn ngữ là tên của nó. Nó có một số định nghĩa. Perl ban đầu là viết tắt của Practical Extraction Report Language (ngôn ngữ thực tế để trích xuất và báo cáo). Tuy nhiên, các lập trình viên thường gọi nó là Phatologically Eclectic Rubbish Lister hoặc thậm chí là Thực tế mọi thứ thực sự đáng yêu.

Hãy dành vài phút để hiểu Perl là gì và những nhiệm vụ nào được giao cho nó tại thời điểm tạo ra nó. Trở lại năm 1986, Larry Wall đang thực hiện nhiệm vụ tạo báo cáo từ một số lượng lớn tệp văn bản giao nhau. Là một lập trình viên Unix, và cũng vì nhiệm vụ liên quan đến thao tác với nội dung của tệp văn bản, lần đầu tiên anh thử sử dụng Awk. Nhưng rõ ràng là Awk không phù hợp với công việc và không có ứng cử viên nào khác để giải quyết nhiệm vụ, nó chỉ còn cách phát minh ra công cụ của riêng mình có thể được sử dụng trong tương lai.

Thay vì lãng phí thời gian, Larry chỉ cần phát minh ra một ngôn ngữ lập trình mới và viết một trình thông dịch cho nó. Có vẻ như là một nghịch lý, nhưng nó không hoàn toàn đúng - những gì bạn làm luôn tốn rất nhiều công sức, nhưng nếu bạn làm đúng, công việc này chắc chắn sẽ được đền đáp.

Larry đã sớm cung cấp tác phẩm của mình cho cộng đồng độc giả của các nhóm tin Usenet. Người dùng có quyền truy cập vào Usenet đã cung cấp cho người tạo Perl một "hiệu quả hỗ trợ trở lại", hỏi cách thực hiện một việc, một việc khác, một việc thứ ba. Nhiều nhiệm vụ trong số này mà Larry thậm chí sẽ không đặt ra cho ngôn ngữ lập trình mới nhỏ bé của mình.

Ngôn ngữ mới chương trình tập trung vào quản lý hệ thống và xử lý văn bản. Sau vài lần sửa đổi, anh ấy đã có thể sử dụng các biểu thức thông thường, tín hiệu cũng như ổ cắm mạng. Nó được gọi là Perl và rất nhanh chóng trở nên phổ biến trong giới lập trình viên Unix, và ngay sau đó là tất cả chúng ta.

Larry không còn duy trì Perl một mình mà vẫn giữ chức danh độc quyền của mình là nhà phát triển trưởng.

Các chương trình Perl rất giống với các chương trình C, có lẽ vì Perl được viết bằng C, hoặc có lẽ vì Larry thấy một số cấu trúc C thuận tiện. Nhưng Perl ít mô phạm hơn và ngắn gọn hơn nhiều so với C.

Perl được thiết kế để giúp lập trình viên thực hiện các tác vụ thông thường quá khó hoặc kém linh hoạt đối với trình bao và quá khó hiểu hoặc khó viết mã cho C (hoặc bất kỳ ngôn ngữ nào khác).

Khi bạn cảm thấy thoải mái hơn với Perl, có thể bạn sẽ thấy mình dành ít thời gian hơn đáng kể để trích dẫn chính xác các tùy chọn trình bao khác nhau (hoặc thực hiện chính xác các khai báo C), và có nhiều thời gian hơn để đọc tin tức Usenet và trượt tuyết xuống núi. sự phát triển của bạn với tư cách là một lập trình viên. “Người xưa” có nói: “Bạn không nên học một ngôn ngữ lập trình không thay đổi hoàn toàn ý tưởng lập trình của bạn”. Hãy yên tâm rằng một khi bạn học Perl, bạn sẽ xem xét lập trình từ một góc độ hoàn toàn khác.

Các cấu trúc mạnh mẽ của ngôn ngữ này cho phép bạn tạo ra các giải pháp rất hiệu quả với nỗ lực tối thiểu và công cụ phổ quát. Bạn có thể tiếp tục sử dụng những công cụ này vì các chương trình được viết bằng Perl có tính di động cao và sẵn sàng để sử dụng. Do đó, bạn sẽ có nhiều thời gian hơn để đọc tin tức Usenet và ghé thăm các quán bar với bạn bè.

Perl rất giỏi trong việc xử lý các tác vụ cấp thấp, đặc biệt là sau khi phát hành phiên bản thứ năm của ngôn ngữ.

Chi phí và giấy phép

Perl là miễn phí. Nói chính xác hơn, Perl được phân phối theo Giấy phép Công cộng GNU. Đầy nguồn và tài liệu hoàn toàn miễn phí để sao chép, biên dịch và in ấn. Tất cả các chương trình bạn viết bằng Perl đều là của bạn và bạn có thể làm bất cứ điều gì bạn muốn với chúng.

Bên cạnh các máy tính UNIX, Perl cũng tồn tại cho các nền tảng khác - Windows, DOS, Atari, Amiga, v.v.

Bạn đã cài đặt Perl chưa?

Rất dễ dàng để biết bạn có Perl hay không. Chỉ cần đưa ra lệnh sau trên dòng lệnh:

perl -v Đây là perl, phiên bản 5.001
Patchlevel không chính thức 1m.
Copyright 1987-1994, Larry Wall Cổng Win32 Copyright 1995 Microsoft Corporation. Đã đăng ký Bản quyền.
Được phát triển bởi hip Communications iNC., //info.hip.com/info/
Perl cho Win32 Bản dựng 107
Được xây dựng vào ngày 16 tháng 4 [email được bảo vệ]:47:22
Perl chỉ có thể được sao chép theo các điều khoản của Giấy phép Nghệ thuật hoặc GNU chung Giấy phép Công cộng, có thể tìm thấy trong bộ nguồn Perl 5.0.

Nếu bạn nhận được thông báo lỗi hoặc nếu bạn có Perl phiên bản 4, hãy liên hệ với quản trị viên hệ thống của bạn hoặc tự cài đặt Perl.

Chương trình Perl đầu tiên của bạn

Chương trình Perl đầu tiên của bạn minh họa việc xuất một dòng văn bản ra màn hình. Để bắt đầu, bạn phải tạo một tệp văn bản đơn giản chứa chương trình Perl của bạn. Sau đó, bạn sẽ chạy tệp với chương trình của mình.

tạo chương trình

Một chương trình Perl là một tệp văn bản thuần có chứa một số cấu trúc ngôn ngữ. Cái sau thường trông giống như một hỗn hợp của C, Unix shell script và bằng tiếng Anh. Nói chung, đây chính xác là cách nó thực sự là.

Mã Perl có thể khá đa dạng. Dưới đây là một số quy tắc cơ bản:

Không gian hàng đầu trong chuỗi được bỏ qua. Bạn có thể đặt toán tử ngôn ngữ ở bất cứ đâu bạn muốn: ở đầu dòng, thụt vào (được khuyến nghị) hoặc thậm chí là căn phải (nhưng trong trường hợp này sẽ cực kỳ khó đọc văn bản chương trình và hiểu bất cứ điều gì);

Một cấu trúc ngôn ngữ phải kết thúc bằng dấu chấm phẩy, trừ khi đó là cấu trúc cuối cùng trong một khối hoặc tệp hoặc đó là một câu lệnh eval;

Khoảng cách, tab, dòng trống không liên quan - một khoảng trắng cũng tốt như hàng trăm khoảng trắng như vậy. Điều này có nghĩa là bạn có thể chia cấu trúc ngôn ngữ thành nhiều dòng cho rõ ràng. Một chuỗi thường là một chuỗi các ký tự được đặt trong dấu ngoặc kép. Chương 2, Chữ số và chuỗi, chứa nhiều hơn miêu tả cụ thể dòng;

Mọi thứ theo sau ký tự "#" đều bị bỏ qua trừ khi nó nằm trong một dòng. Sử dụng cơ hội này để cung cấp nhận xét hữu ích cho mã của bạn. Cần lưu ý rằng không có nhận xét nhiều dòng (ví dụ: như trong ngôn ngữ C) trong Perl.

Giống như một tập lệnh shell, một chương trình Perl bao gồm tất cả các câu lệnh Perl trong một tệp, được gộp chung thành một chương trình lớn sẽ được thực thi. Khái niệm hàm chính, như trong C, không có trong Perl.

Tôi muốn cảnh báo trước với bạn rằng bài viết này sẽ không giúp bạn trở thành một lập trình viên PERL siêu hạng, nhưng nó sẽ cung cấp cho bạn một số kiến ​​thức cần thiết. thông tin ban đầu, sẽ giúp bạn nghiên cứu sâu hơn về ngôn ngữ lập trình thú vị nhất này.

Tôi quyết định viết bài này sau khi tôi phát hiện ra rằng thật khó để "hiểu được" mọi thứ, ngay cả khi bạn có sẵn một số loại hướng dẫn PERL. Ở mọi nơi, ngay từ đầu, họ bắt đầu đề cập đến một số thuật ngữ và mệnh lệnh bí ẩn, và bạn chỉ cần chớp mắt ngạc nhiên, hoặc (nếu bạn vẫn hiểu điều gì đó) hãy làm cho các chương trình này hoạt động (không phải "như bình thường", nhưng nói chung!). Bài viết này có thể được gọi là "PERL dành cho người mới bắt đầu" nếu nó bao gồm tất cả các tài liệu, nhưng ở đây tôi đặt mục tiêu chỉ cung cấp cho bạn những khái niệm ban đầu cần thiết và có thể nói là "chuẩn bị cho những trận chiến tiếp theo" :). Mặc dù rất có thể trong tương lai, "theo yêu cầu của người lao động", bài viết nhỏ này sẽ phát triển thành một thứ gì đó hơn thế nữa.

Vậy hãy bắt đầu!

Trước tiên, hãy để tôi nói với bạn rằng PERL cần được cài đặt trên máy tính của bạn. Điều này, có vẻ như, Hoạt động đơn giản một số người bạn của tôi đã hoàn toàn bỏ qua nó và sau khi viết một chương trình đơn giản, họ đã cố gắng chạy nó trong một thời gian dài ...;) Gói PERL dễ truy cập nhất (theo ý kiến ​​​​của tôi) là ActivePerl, mặc dù gói này nhắm đến người dùng Windows và nếu bạn có UNIX, thì bạn có thể tải xuống thứ gì đó có nguồn gốc từ www.perl.com. Bằng cách này hay cách khác, bạn sẽ nhận được và cài đặt perl (nếu bạn chưa cài đặt). Vì vậy: bạn sẽ có một thư mục "perl" mới, nhưng điều này hoàn toàn không có nghĩa là tất cả các chương trình cần được đặt ở đó :) Perl, ngồi ở đó, chỉ thực hiện tất cả những sáng tạo tuyệt vời của bạn với phần mở rộng *.pl và chỉ vị trí của chúng - một người dùng biết :) (hợp lệ cho người dùng windows đã cài đặt ActivePerl, vì nó liên kết các tệp *.pl).

Bởi vì Vì bài viết này chủ yếu dành cho người dùng windows, nên tôi cho rằng mình có nghĩa vụ phải nói với bạn rằng đối với các chương trình có thể thực thi được trong bài viết này hệ điều hành không cần thiết phải bắt đầu mỗi chương trình với dòng:

#!/usr/bin/perl

Vấn đề là ngôn ngữ này được tạo ra trên cơ sở HĐH UNIX và họ đang cố gắng chuyển dòng này cho chúng tôi như một "di sản" từ HĐH của họ. Tuy nhiên, bạn nên nhớ rằng máy chủ (nếu bạn quyết định đặt các chương trình của mình ở đó) cũng có thể có UNIX.

Bây giờ một chút về phương pháp viết. Tôi khuyên bạn nên bắt đầu sử dụng một notepad đơn giản để ghi nhớ tất cả các lệnh và cú pháp lập trình. Trong tương lai, bạn có thể sử dụng một số loại trình soạn thảo, nhưng điều này không còn phù hợp nữa :), và càng không mong muốn hơn đối với những người mới làm quen với ngôn ngữ lập trình này và lập trình nói chung.

Hầu như tất cả các hướng dẫn về ngôn ngữ này đều bắt đầu với chương trình đơn giản nhất, trông giống như thế này:

print("Xin chao, THẾ GIỚI!\n");

Một số bạn có thể đã sao chép chương trình trên vào tệp của mình và nhận thấy rằng nó mở nhanh và đóng cũng nhanh. Điều này là do chương trình là một chương trình, sau khi thực hiện xong nó sẽ đóng lại ngay lập tức, vì vậy hãy thêm một dòng nữa vào chương trình với nội dung như sau:

Kết quả là, tất cả điều này sẽ có dạng sau:

print("Xin chao, THẾ GIỚI!\n"); ;

Nó không dễ dàng như vậy đối với những người không quen biết... Nó thậm chí còn trông hơi đáng sợ... Nhưng điều này chỉ dành cho những người không quen biết, trên thực tế, mọi thứ không đơn giản hơn ở đâu cả! :) Không thể tin được? Bây giờ tôi sẽ chứng minh điều đó. Đầu tiên, bạn cần biết rằng print là lệnh in thông tin ra đầu ra tiêu chuẩn STDOUT (STanDart OUT hay đơn giản hơn là xuất ra màn hình). Thứ hai, điều khó hiểu ở dạng \n là sự chuyển đổi sang một dòng mới (dòng mới), nhưng không phải chương trình, như một số người có thể e ngại, mà là thông tin trên màn hình, tức là. nếu bạn tiếp tục văn bản được đặt trong dấu ngoặc kép, thì sau ký tự này, nó sẽ được in bằng dòng mới. Và nếu bạn cần sử dụng dấu gạch chéo ngược (shels :) trong chính văn bản, thì bạn cần đặt thêm một dấu gạch chéo trước nó. Ví dụ:

in "\ a"; #Command sau đó Perl #in tín hiệu tới SPICERprint "\\a"; #Perl sẽ chỉ in \a

Sau đó, tôi muốn làm hài lòng bạn: không cần dấu ngoặc đơn :) Việc sử dụng chúng hoàn toàn phụ thuộc vào tâm trạng của bạn, mặc dù sách hướng dẫn nói rằng điều này được cho là giúp làm nổi bật văn bản trong chương trình. Nói chung - ai thích nó hơn ... Như bạn có thể đoán - cần có dấu ngoặc kép để đặt văn bản trong đó, vì vậy có hai mốt khó hiểu còn lại. Nhưng trước khi đi sâu vào chúng, tôi cho rằng cần phải giải thích cho bạn biết loại thông tin nào có trong Perl. Đơn vị cơ bản của thông tin trong Perl là vô hướng. một giá trị duy nhất được lưu trữ trong một biến duy nhất.

$a = "xin chào thế giới!"; #Gán một số văn bản cho biến $a $b = 777; #Gán một số cho $b

Các biến này lưu trữ chuỗi, số và tham chiếu. Khi làm như vậy, cần phải hiểu sự khác biệt giữa các số như vậy và các số chứa trong một chuỗi.

$abc = "123"; #Số trong chuỗi $123 = 123; #Số như vậy

Nếu bạn cần một số để tính toán, thì đừng đặt dấu ngoặc kép.

Dấu chấm phẩy ở cuối mỗi dòng thực ra là ... cuối dòng, nghĩa là bạn có thể viết toàn bộ chương trình trong một dòng, nhưng chúng ta không quan tâm đến các dòng :) Có một ngoại lệ ở trên : dấu # chỉ ra rằng mọi thứ ở dòng sau nó là nhận xét và không còn áp dụng cho chương trình. Dấu kim cương là mặc định hoặc nói một cách dễ hiểu là đầu vào tiêu chuẩn từ màn hình (Tôi giải thích: một yêu cầu xuất hiện trên màn hình và tất nhiên bạn nhập thông qua bàn phím. Sau đó, bạn nhấn enter và giá trị đã nhập đã sẵn sàng trong biến Perl, nếu nó được đặt). Toàn bộ mẹo để thêm viên kim cương này trong trường hợp của chúng tôi là nó sẽ hỏi bạn về đầu vào này cho đến khi bạn nhấn nút "enter" và vì chương trình không chỉ định phải làm gì với đầu vào này, perl sẽ đơn giản quên nó đi và sẽ xem xét chương trình của chúng tôi đã hoàn thành. Và kết quả của việc thực hiện chương trình này, chúng ta sẽ thấy dòng chữ Xin chào, thế giới! .

Bây giờ hãy làm phức tạp chương trình của chúng ta một chút:

in "nhập tên bạn: "; tên $ = ; in "xin chào tên $!"; ;

Bạn nên hiểu rằng các chương trình được thực thi từng dòng một, tức là đầu tiên là dòng đầu tiên, sau đó là dòng thứ hai, v.v.

Vì vậy, trong dòng đầu tiên, chúng tôi hiển thị lời nhắc nhập tên người dùng. Ở dòng thứ hai, chúng ta đọc nó vào biến $name. $name, như đã đề cập, là một biến vô hướng Perl bắt đầu bằng ký hiệu đô la. Sắp tới, tôi sẽ cho bạn biết rằng ngoài các biến bắt đầu bằng một đô la, còn có mảng (@array), hàm băm (%hash) và một số loại khác mà còn quá sớm để nói đến. Có sự bình đẳng giữa biến và viên kim cương, nghĩa là chúng ta đang gán kết quả của truy vấn cho biến. Trên dòng thứ ba, chúng tôi in từ xin chào và sau đó, chúng tôi in nội dung được lưu trữ trong biến $name. Trong trường hợp của chúng tôi, đây là tên chúng tôi yêu cầu.

Hãy thực hiện một trò giải trí khác, nơi tôi sẽ cho bạn biết bạn có thể làm gì với các biến... Bạn có thể làm BẤT CỨ ĐIỀU GÌ với chúng! Và đây không phải là một cường điệu. Ví dụ, điều này là có thể:

$a = 3; $b = 4; $c = $a+$b; #Thêm hai biến và #gán chúng cho biến thứ ba print $c; # In kết quả print $a+$b; # giống nhau, nhưng không có biến thứ ba

Tôi hy vọng mọi thứ đều rõ ràng với điều này ... Trong khi chờ đợi, chúng ta sẽ viết một chương trình thực thi các lệnh dir của DOS. Đối với những người không biết - dir là một lệnh hiển thị nội dung của thư mục bạn đang ở.

$dos = `dir`; in $ dos; ;

Chương trình này đọc vào biến $dos kết quả của lệnh dir, được đặt trong dấu ngoặc kép (nếu là dấu ngoặc đơn đơn giản, nó sẽ không phải là lệnh, mà chỉ là một từ) và sau đó hiển thị chính kết quả này trên màn hình.

Bây giờ, có thể nói, chúng ta hãy quay lại với con cừu của chúng ta, hay đúng hơn là bây giờ chỉ với con cừu :) Chúng ta đã học cách hiển thị văn bản chúng ta cần trên màn hình, nhận thông tin từ người dùng và cũng biết rằng các lệnh DOS ở phía sau các trích dẫn sẽ được thực thi dưới dạng các lệnh DOS :) Đã đến lúc viết một chương trình không yêu cầu gì hơn ngoài các lệnh này

in "nhập lệnh: "; chmod($com=); in `$com`; ;

Vì lý do bảo mật, tôi thực sự khuyên bạn không nên nhập lệnh ĐỊNH DẠNG, đoán xem tại sao :) Trong số những đổi mới, cần làm nổi bật sự xuất hiện của lệnh chmod(). Lệnh này xóa ký tự dòng mới \n khỏi thông tin mà chúng tôi nhận được trong yêu cầu, theo mặc định, thông tin này có ở đó. Những gì trên dòng thứ hai là một ký hiệu viết tắt của hai dòng:

Chúng tôi chỉ đạt được một vài ký tự với điều này, nhưng nó vẫn rất tuyệt :)

Về điều này, tôi nghĩ rằng bạn đã vượt qua những bước đầu tiên và sẵn sàng tiếp tục con đường học Perl đầy chông gai.

Tất cả những điều sau đây không có cách nào tuyên bố là đầy đủ và đáng tin cậy.

Tôi muốn cảnh báo trước với bạn rằng bài viết này sẽ không giúp bạn trở thành một lập trình viên PERL siêu hạng, nhưng nó sẽ cung cấp cho bạn một số thông tin ban đầu cần thiết giúp bạn tiếp tục học ngôn ngữ lập trình thú vị nhất này.

Tôi quyết định viết bài này sau khi tôi phát hiện ra rằng thật khó để "hiểu được" mọi thứ, ngay cả khi bạn có sẵn một số loại hướng dẫn PERL. Ở mọi nơi, ngay từ đầu, họ bắt đầu đề cập đến một số thuật ngữ và mệnh lệnh bí ẩn, và bạn chỉ cần chớp mắt ngạc nhiên, hoặc (nếu bạn vẫn hiểu điều gì đó) hãy làm cho các chương trình này hoạt động (không phải "như bình thường", nhưng nói chung!). Bài viết này có thể được gọi là "PERL dành cho người mới bắt đầu" nếu nó bao gồm tất cả các tài liệu, nhưng ở đây tôi đặt mục tiêu chỉ cung cấp cho bạn những khái niệm ban đầu cần thiết và có thể nói là "chuẩn bị cho những trận chiến tiếp theo" :). Mặc dù rất có thể trong tương lai, "theo yêu cầu của người lao động", bài viết nhỏ này sẽ phát triển thành một thứ gì đó hơn thế nữa.

Vậy hãy bắt đầu!

Trước tiên, hãy để tôi nói với bạn rằng PERL cần được cài đặt trên máy tính của bạn. Một số người bạn của tôi đã hoàn toàn bỏ qua thao tác có vẻ đơn giản này và sau khi viết một chương trình đơn giản, họ đã cố gắng chạy nó trong một thời gian dài ...;) Gói PERL dễ tiếp cận nhất (theo ý kiến ​​​​của tôi) là ActivePerl, mặc dù gói này nhằm mục đích tại người dùng Windows và nếu bạn có UNIX, bạn có thể tải xuống thứ gì đó có nguồn gốc từ www.perl.com. Bằng cách này hay cách khác, bạn sẽ nhận được và cài đặt perl (nếu bạn chưa cài đặt). Vì vậy: bạn sẽ có một thư mục "perl" mới, nhưng điều này hoàn toàn không có nghĩa là tất cả các chương trình cần được đặt ở đó :) Perl, ngồi ở đó, chỉ thực hiện tất cả những sáng tạo tuyệt vời của bạn với phần mở rộng *.pl và chỉ vị trí của chúng - một người dùng biết :) (hợp lệ cho người dùng windows đã cài đặt ActivePerl, vì nó liên kết các tệp *.pl).

Bởi vì Vì bài viết này chủ yếu dành cho người dùng windows, nên tôi buộc phải nói với bạn rằng đối với các chương trình chạy trên hệ điều hành này, không nhất thiết phải khởi động từng chương trình bằng dòng:

#!/usr/bin/perl

Vấn đề là ngôn ngữ này được tạo ra trên cơ sở HĐH UNIX và họ đang cố gắng chuyển dòng này cho chúng tôi như một "di sản" từ hệ điều hành của họ. Tuy nhiên, bạn nên nhớ rằng máy chủ (nếu bạn quyết định đặt các chương trình của mình ở đó) cũng có thể có UNIX.

Bây giờ một chút về phương pháp viết.
Tôi khuyên bạn nên bắt đầu sử dụng một notepad đơn giản để ghi nhớ tất cả các lệnh và cú pháp lập trình. Trong tương lai, bạn có thể sử dụng một số loại trình soạn thảo, nhưng điều này không còn phù hợp nữa :), và càng không mong muốn hơn đối với những người mới làm quen với ngôn ngữ lập trình này và lập trình nói chung.

Hầu như tất cả các hướng dẫn về ngôn ngữ này đều bắt đầu với chương trình đơn giản nhất, trông giống như thế này:

print("Xin chao, THẾ GIỚI!\n");

Một số bạn có thể đã sao chép chương trình trên vào tệp của mình và nhận thấy rằng nó mở nhanh và đóng cũng nhanh. Điều này là do chương trình là một chương trình, sau khi thực hiện xong nó sẽ đóng lại ngay lập tức, vì vậy hãy thêm một dòng nữa vào chương trình với nội dung như sau:

Kết quả là, tất cả điều này sẽ có dạng sau:

print("Xin chao, THẾ GIỚI!\n");
<>;

Nó không dễ dàng như vậy đối với những người không quen biết... Nó thậm chí còn trông hơi đáng sợ... Nhưng điều này chỉ dành cho những người không quen biết, trên thực tế, mọi thứ không đơn giản hơn ở đâu cả! :) Không thể tin được? Bây giờ tôi sẽ chứng minh điều đó.
Đầu tiên, bạn cần biết rằng print là lệnh in thông tin ra đầu ra tiêu chuẩn STDOUT (STanDart OUT hay đơn giản hơn là xuất ra màn hình).
Thứ hai, điều khó hiểu ở dạng \n là sự chuyển đổi sang một dòng mới (dòng mới), nhưng không phải chương trình, như một số người có thể e ngại, mà là thông tin trên màn hình, tức là. nếu bạn tiếp tục văn bản được đặt trong dấu ngoặc kép, thì sau ký tự này, nó sẽ được in trên một dòng mới. Và nếu bạn cần sử dụng dấu gạch chéo ngược (shels :) trong chính văn bản, thì bạn cần đặt thêm một dấu gạch chéo trước nó. Ví dụ:

in "\ a"; #Command sau đó Perl #in tín hiệu tới SPICER print "\\a"; #Perl sẽ chỉ in \a

Sau đó, tôi muốn làm hài lòng bạn: không cần dấu ngoặc đơn :) Việc sử dụng chúng hoàn toàn phụ thuộc vào tâm trạng của bạn, mặc dù sách hướng dẫn nói rằng điều này được cho là giúp làm nổi bật văn bản trong chương trình. Nói chung ai thích hơn thì...
Như bạn có thể đã đoán, các trích dẫn là cần thiết để đặt văn bản trong đó, vì vậy có hai mốt khó hiểu còn lại. Nhưng trước khi đi sâu vào chúng, tôi cho rằng cần phải giải thích cho bạn biết loại thông tin nào có trong Perl.
Đơn vị cơ bản của thông tin trong Perl là vô hướng. một giá trị duy nhất được lưu trữ trong một biến duy nhất.

$a = "xin chào thế giới!"; #Gán một số văn bản cho biến $a
$b = 777; #Gán một số cho $b

Các biến này lưu trữ chuỗi, số và tham chiếu. Khi làm như vậy, cần phải hiểu sự khác biệt giữa các số như vậy và các số chứa trong một chuỗi.

$abc = "123"; #Số trong hàng
$123 = 123; #Số như vậy

Nếu bạn cần một số để tính toán, thì đừng đặt dấu ngoặc kép.

Dấu chấm phẩy ở cuối mỗi dòng thực ra là ... cuối dòng, nghĩa là bạn có thể viết toàn bộ chương trình trong một dòng, nhưng chúng ta không quan tâm đến các dòng :) Có một ngoại lệ ở trên : dấu # chỉ ra rằng mọi thứ ở dòng sau nó là nhận xét và không còn áp dụng cho chương trình.
Dấu hiệu hình thoi<>- đây là mặc định hoặc, nói bằng ngôn ngữ đơn giản - đầu vào tiêu chuẩn từ màn hình (Tôi giải thích: một yêu cầu xuất hiện trên màn hình và tất nhiên bạn nhập thông qua bàn phím. Sau đó, bạn nhấn enter và giá trị đã nhập đã có trong biến Perl, nếu nó đã được thiết lập). Toàn bộ mẹo để thêm viên kim cương này trong trường hợp của chúng tôi là nó sẽ hỏi bạn về đầu vào này cho đến khi bạn nhấn nút "enter" và vì chương trình không chỉ định phải làm gì với đầu vào này, perl sẽ đơn giản quên nó đi và sẽ xem xét chương trình của chúng tôi đã hoàn thành. Và kết quả của việc thực hiện chương trình này, chúng ta sẽ thấy dòng chữ Xin chào, thế giới! .

Bây giờ hãy làm phức tạp chương trình của chúng ta một chút:

in "nhập tên bạn: ";
tên $ =<>;
in "xin chào tên $!";
<>;

Bạn nên hiểu rằng các chương trình được thực thi từng dòng một, tức là đầu tiên là dòng đầu tiên, sau đó là dòng thứ hai, v.v.

Vì vậy, trong dòng đầu tiên, chúng tôi hiển thị lời nhắc nhập tên người dùng. Ở dòng thứ hai, chúng ta đọc nó vào biến $name. $name, như đã đề cập, là một biến vô hướng Perl bắt đầu bằng ký hiệu đô la. Sắp tới, tôi sẽ cho bạn biết rằng ngoài các biến bắt đầu bằng một đô la, còn có mảng (@array), hàm băm (%hash) và một số loại khác mà còn quá sớm để nói đến. Có sự bình đẳng giữa biến và viên kim cương, nghĩa là chúng ta đang gán kết quả của truy vấn cho biến. Trên dòng thứ ba, chúng tôi in từ xin chào và sau đó, chúng tôi in nội dung được lưu trữ trong biến $name. Trong trường hợp của chúng tôi, đây là tên chúng tôi yêu cầu.

Hãy thực hiện một trò giải trí khác, nơi tôi sẽ cho bạn biết bạn có thể làm gì với các biến... Bạn có thể làm BẤT CỨ ĐIỀU GÌ với chúng! Và đây không phải là một cường điệu. Ví dụ, điều này là có thể:

$a = 3;
$b = 4;
$c = $a+$b; #Thêm hai biến và
# gán chúng cho thứ ba
in $c; # Xuất số kết quả
in $a+$b; # giống nhau, nhưng không có
# đưa vào biến thứ ba

Tôi hy vọng mọi thứ đều rõ ràng với điều này ... Trong khi chờ đợi, chúng ta sẽ viết một chương trình thực thi các lệnh dir của DOS. Đối với những người không biết - dir là một lệnh hiển thị nội dung của thư mục bạn đang ở.

$dos = `dir`;
in $ dos;
<>;

Chương trình này đọc vào biến $dos kết quả của lệnh dir, được đặt trong dấu ngoặc kép (nếu là dấu ngoặc đơn đơn giản, nó sẽ không phải là lệnh, mà chỉ là một từ) và sau đó hiển thị chính kết quả này trên màn hình.

Bây giờ, có thể nói, chúng ta hãy quay lại với con cừu của chúng ta, hay đúng hơn là bây giờ chỉ với con cừu :) Chúng ta đã học cách hiển thị văn bản chúng ta cần trên màn hình, nhận thông tin từ người dùng và cũng biết rằng các lệnh DOS ở phía sau các trích dẫn sẽ được thực thi dưới dạng các lệnh DOS :) Đã đến lúc viết một chương trình không yêu cầu gì hơn ngoài các lệnh tương tự này:

in "nhập lệnh: ";
chmod($com =<>);
in `$com`;
<>;

Vì lý do bảo mật, tôi thực sự khuyên bạn không nên nhập lệnh FORMAT, hãy đoán xem tại sao :) Trong số các đổi mới, cần làm nổi bật sự xuất hiện của lệnh chmod(). Lệnh này xóa ký tự dòng mới \n khỏi thông tin mà chúng tôi nhận được trong yêu cầu, theo mặc định, thông tin này có ở đó. Những gì trên dòng thứ hai là một ký hiệu viết tắt của hai dòng:

Chúng tôi chỉ đạt được một vài ký tự với điều này, nhưng nó vẫn rất tuyệt :)

Về điều này, tôi nghĩ rằng bạn đã vượt qua những bước đầu tiên và sẵn sàng tiếp tục con đường học Perl đầy chông gai.

Tuy nhiên, ngôn ngữ kịch bản được sử dụng rộng rãi nhất là Perl.

Chương này nói về ngôn ngữ Perl và cách sử dụng nó. Khi bạn học cách lập trình với Perl, bạn có thể sử dụng nó để viết các tập lệnh thực hiện nhiều tác vụ lập trình Internet và Web.

Sự nhấn mạnh đặc biệt sẽ được đặt vào những tính năng được sử dụng khi viết các tập lệnh CGI. Nếu bạn chưa bao giờ lập trình bằng Perl trước đây, hãy sử dụng chương này làm điểm khởi đầu để học nó.

Các khái niệm bạn sẽ học trong chương này sẽ dạy bạn cách viết các tập lệnh Perl chuyên nghiệp.

Chương này không chỉ trình bày những kiến ​​thức cơ bản về lập trình Perl mà còn một số khía cạnh khác nữa. Khi bạn đọc xong chương này, bạn sẽ có thể nắm được các khái niệm chính sau: Perl là một ngôn ngữ lập trình thông dịch tập trung đặc biệt vào xử lý văn bản.

Các lập trình viên thường gọi các chương trình Perl là các tập lệnh. Sử dụng Perl, các lập trình viên tạo các biểu mẫu CGI.

Perl hỗ trợ các thao tác với tệp và cơ sở dữ liệu. Điều này làm cho nó rất phù hợp để lưu trữ và truy xuất thông tin theo nhu cầu của người dùng Web.

Perl đi kèm với một chương trình sửa lỗi mà bạn kiểm tra mã Perl của mình

Trong phần này:

8 Ngôn ngữ lập trình PERL
Bài viết này sẽ giới thiệu cho bạn khóa học ngôn ngữ Perl, mang lại cho bạn đặc điểm so sánh Perl và C/C++, nói về sự phong phú của Perl.

8 Sử dụng PERL
Nguyên tắc sử dụng Perl, hoặc những gì có thể được thực hiện với Perl.

8 Giới thiệu về PERL
Các khái niệm cơ bản của ngôn ngữ Perl, ví dụ đầu tiên.

8 Cài đặt PERL
Một gợi ý nhỏ về cách trở thành Perl.

8 Sử dụng Trình gỡ lỗi PERL
Các nguyên tắc cơ bản khi làm việc với trình gỡ lỗi Perl; lệnh gỡ lỗi; ví dụ về việc sử dụng.

8 Các kiểu dữ liệu trong PERL
Chương này được dành cho các kiểu dữ liệu và quá trình chuyển đổi từ kiểu này sang kiểu khác.

8 Biến
Perl hỗ trợ ba loại biến: vô hướng, mảng và mảng kết hợp. Về họ và bài phát biểu. ;-)

8 câu lệnh PERL
Tổng quan về các toán tử Perl cơ bản.

8 cấu trúc PERL
Mô tả các tính năng cú pháp Perl. các nhà khai thác chính.

8 chương trình con
Cú pháp và ngữ nghĩa của chương trình con trong Perl.

8 xử lý chuỗi
Mô tả các hàm xử lý biến chuỗi.

8 xử lý danh sách
Một số chức năng mở rộng phạm vi khả năng làm việc với danh sách.

8 Làm việc với mảng
Perl có một số hàm dựng sẵn giúp bạn làm việc với các phần tử mảng.

8 Viết kịch bản CGI với PERL
Trong chương này, bạn sẽ học cách sử dụng Perl để tạo tập lệnh CGI.

Các kiểu dữ liệu được sử dụng trong các chương trình khi khai báo các biến. Tóm lại, một kiểu dữ liệu xác định tập hợp các giá trị mà một biến có thể nhận, cũng như tập hợp các thao tác mà một chương trình có thể thực hiện trên đó. Trong Perl, dữ liệu có thể là một số hoặc một chuỗi ký tự.

Một giá trị duy nhất được gọi là giá trị vô hướng hoặc đơn giản là vô hướng. Sau đây là các ví dụ về giá trị vô hướng được sử dụng trong ngôn ngữ Perl:
- Thập phân: 127 hoặc 127.0 hoặc 1.27E2
- Thập lục phân: 0x7F hoặc 0x7f
- Bát phân: 0177 (số 0 đầu tiên cho biết số bát phân được sử dụng)
- Chuỗi: "Xin chào thế giới\n" hoặc "Xin chào thế giới"

Ví dụ: lệnh sau sử dụng trình gỡ lỗi Perl để hiển thị số 0177 hệ bát phân, tương ứng với số thập phân 127:

D.B.<4>trang 0177 127

Perl dịch dữ liệu sang định dạng bên trong của nó. Khi Perl in các giá trị bát phân hoặc thập lục phân, trước tiên nó sẽ chuyển đổi chúng sang định dạng thập phân, như minh họa.

Lưu ý: Như bạn sẽ học, tập lệnh Perl cho phép bạn sử dụng hàm printf để in ra các giá trị ở định dạng có thể gọi được, chẳng hạn như bát phân hoặc thập lục phân.

Biểu diễn bên trong của tất cả các số là định dạng dấu phẩy động có độ chính xác kép. Nói cách khác, không có số nguyên nào trong số các định dạng bên trong. Tuy nhiên, trong hầu hết các trường hợp, bạn có thể bỏ qua điều này và Perl sẽ làm điều phù hợp với bạn. Ví dụ: nếu bạn sử dụng các giá trị trong ngữ cảnh mà chỉ các giá trị số nguyên mới có ý nghĩa, thì Perl sẽ tự động cắt bớt chính số đó.

Lưu ý: Nếu bạn đang lập trình trong C và đã sử dụng phép chia số nguyên với phép cắt bớt số nguyên một cách tự động, thì khi lập trình trong Perl, bạn phải nhớ thực hiện phép cắt thủ công bằng cách sử dụng hàm int().

Lệnh sau minh họa cách Perl xử lý các số nguyên và dấu chấm động:

In 6 & 3; # sẽ in 2 in 6.9 & 3.1 # in 7 / 2 # in 2.3333 không phải số nguyên print int(7/3) # in 2

Giống như Perl chuyển đổi số dấu phẩy động thành số nguyên: khi tập lệnh sử dụng giá trị số nguyên, nó cũng chuyển đổi số thành chuỗi và ngược lại khi chuyển đổi như vậy có ý nghĩa. Ví dụ: nếu tập lệnh sử dụng số trong ngữ cảnh chỉ có chuỗi mới có nghĩa, chẳng hạn như nối chuỗi, tập lệnh sẽ chuyển đổi số thành chuỗi. Tương tự, nếu bạn muốn sử dụng các chuỗi chỉ có số mới có nghĩa, thì Perl sẽ chuyển đổi chúng thành số. Khi làm việc với các tập lệnh Perl, bạn thường không phải lo lắng về biểu diễn bên trong của các đại lượng vô hướng.

Perl cũng hỗ trợ khái niệm giá trị boolean, nhưng không có kiểu đặc biệt để mô tả chúng. Như trong C, một giá trị số được coi là đúng nếu nó khác không. Ngoài ra, một giá trị chuỗi được coi là đúng nếu nó không bằng "" hoặc "0". Một số toán tử boolean như<>> (lớn hơn), trả về một giá trị<истинно>và không như<ложно>.

Do đó, tập lệnh của bạn chỉ nên coi các giá trị khác 0, cả chuỗi và số, dưới dạng giá trị boolean.<истинно>. Các tập lệnh Perl có thể nhóm các đại lượng vô hướng lại với nhau và tạo một danh sách. Nếu kịch bản lưu trữ danh sách trong một biến nào đó, thì biến này sẽ trở thành một mảng (array).

BIẾN

Perl hỗ trợ ba loại biến: vô hướng, mảng và mảng kết hợp. Như trong C, tên biến được viết với sự phân biệt giữa chữ thường và chữ in hoa. Do đó, tên VAR, Var và var mô tả các biến khác nhau. Một tập lệnh có thể có một biến vô hướng được gọi là var và một biến mảng cũng được gọi là var. Chúng sẽ khác nhau trong ngôn ngữ Perl tùy theo ngữ cảnh.

Lưu ý: Các biến Perl không được gõ, như trường hợp trong C. Ví dụ: một biến vô hướng có thể chứa bất kỳ loại vô hướng nào và việc truyền kiểu được thực hiện tự động. Ngoài ra, như bạn có thể nhận thấy, các biến Perl không cần phải khai báo. Nếu một biến không được khai báo, thì Perl coi nó là biến toàn cục. Dưới đây bạn sẽ làm quen với việc khai báo các biến và phạm vi của chúng.

BIẾN TẦNG

Như đã lưu ý, một biến vô hướng có thể chứa một giá trị duy nhất. Trong Perl, tên biến vô hướng luôn bắt đầu bằng dấu ($). Biểu thức sau đặt biến vô hướng $age thành 35 và biến $name thành giá trị chuỗi . Hàm print sau đó được sử dụng để in giá trị của từng biến:

$ tuổi = 35; $name = "Bob"; in($tên,"là",$tuổi);

Nếu bạn lưu các biểu thức này trong một tệp có tên là SCALAR.PL, bạn có thể chạy chương trình như sau:

C:\PERL> Perl SCALAR.PL Bob 35 tuổi

Mảng

Như đã đề cập ở trên, mảng là các biến lấy một danh sách các giá trị vô hướng làm giá trị.Mã Perl sau đây minh họa việc khai báo các biến mảng và khởi tạo của chúng:

@days = ("Chủ Nhật","Thứ Hai","Thứ Ba","Thứ Tư","Thứ Năm","Thứ Sáu","Thứ Bảy"); in(@ngày); # in "SunMonTueWedThuFriSat" print($days); # in "Thu" @weekdays = @days; # value ("Thứ Hai","Thứ Ba","Thứ Tư","Thứ Năm","Thứ Sáu") @emptylist = (); # danh sách chờ

Tham chiếu đến biến kiểu<массив>thường bắt đầu bằng dấu at (@) và theo sau là giá trị trong ngoặc vuông () Cũng như trong lập trình C, chỉ số mảng cho script luôn là biến kiểu số nguyên, thường bắt đầu từ số 0. Bạn sẽ thấy các trường hợp ngoại lệ đối với hai quy tắc này trong các ví dụ sẽ được giải thích trong chương này Biểu thức thứ ba ($days) là một ví dụ về một mảng tham chiếu đến một giá trị vô hướng. Bởi vì nó chỉ chứa một phần tử, nên giá trị kết quả là một số vô hướng.

Nếu bạn sử dụng dấu ($) thay vì dấu @, tập lệnh sẽ đề cập đến một giá trị vô hướng. Nhận xét này rất quan trọng. Dấu ngoặc vuông biểu thị rằng tập lệnh đang tham chiếu đến một mảng. Ngược lại, dấu $ biểu thị tham chiếu đến một giá trị vô hướng. Mảng @weekdays được khởi tạo bằng cách tìm nạp một phần của mảng @days. Trong ví dụ trước, mảng @days được sử dụng mà không có chỉ mục. Khi chỉ mục bị bỏ qua, Perl đề cập đến toàn bộ mảng. Tương tự, trong ví dụ trước, mảng @days được khởi tạo với một danh sách các ký tự.

Ngoài việc có thể gán các giá trị bằng chữ làm giá trị cho một mảng, một tập lệnh cũng có thể gán các biến hoặc thậm chí các mảng khác cho mảng, như minh họa bên dưới:

@stuff = ($age, $name) @FriendsOfMine = ("Joe","Mary", @FriendsOfYours);

Ví dụ sau sử dụng các phần của mảng:

@cuối tuần = @ngày ; # kết quả ("Sun","Sat") print (@ngày); # in "MonTueWedThuFriSunSat"

Nếu tập lệnh sử dụng biến mảng trong ngữ cảnh của biến vô hướng, thì giá trị là số phần tử mảng. Một ngữ cảnh vô hướng là một trong đó chỉ giá trị vô hướng có lý. Ví dụ: biểu thức sau sử dụng ngữ cảnh vô hướng cho mảng thứ để xác định số lượng phần tử có trong mảng. Nếu số lượng phần tử lớn hơn hoặc bằng 2, thì tập lệnh sẽ đưa ra thông báo và kết thúc thực thi:

(@stuff >= 2) || die "Quá nhiều thứ!\n";

Hàm die hướng dẫn Perl kết thúc thực thi và đưa ra thông báo đã chỉ định. Nếu thông báo không được chứa, thì chức năng chỉ cần chấm dứt tập lệnh.

Perl cũng hỗ trợ cấu trúc biến $#, trả về giá trị chỉ mục cuối cùng trong một mảng. Ví dụ, câu lệnh for sau đây sử dụng $[ để xác định giá trị ban đầu của chỉ số mảng và $# để xác định phần tử cuối cùng của mảng. Trong trường hợp này, sử dụng biểu thức for, các giá trị của từng phần tử được hiển thị:

Đối với ($i =$[; $i<= $#stuff; $i++) { print $stuff[$i]; }

Vòng lặp for được viết có thể được thay thế bằng biểu thức tương đương sau:

In @stuff;

VAI TRÒ CỦA BỐI CẢNH ĐỐI VỚI BIẾN LOẠI VÔ SỐ VÀ Vectơ

Lưu ý rằng toán tử xây dựng danh sách (,) giống hệt như toán tử đánh giá tuần tự (,). Toán tử nào được sử dụng phụ thuộc vào ngữ cảnh mà nó xuất hiện, cụ thể là biến đó là vô hướng hay mảng. Perl sử dụng cấu trúc danh sách trong ngữ cảnh của mảng và đánh giá tuần tự cho các đại lượng vô hướng. Hãy xem xét các biểu thức sau:

@an_array = (1,2,3,4,5); $a_scalar = (1,2,3,4,5);

Biểu thức đầu tiên khởi tạo mảng, trong khi biểu thức thứ hai đặt giá trị của biến vô hướng $a_scalar thành 5, loại bỏ bốn giá trị đầu tiên. Xét hai biểu thức sau:

In $assoc(1,2); in @assoc(1,2);

Trường hợp đầu tiên sẽ in một giá trị mảng kết hợp bằng hai khóa, trong khi trường hợp thứ hai sẽ in hai giá trị mảng kết hợp bằng một khóa. Trong hai biểu thức sau, biểu thức đầu tiên sao chép danh sách, trong khi biểu thức thứ hai đặt giá trị vô hướng thành kích thước của mảng:

@x = @list; $x = @list;

Mảng KẾT HỢP

Mảng kết hợp tương tự như mảng thông thường ở chỗ chúng là một danh sách các biến vô hướng, điểm khác biệt là mảng phải sử dụng các giá trị nguyên làm chỉ số khi chọn các phần tử mảng, trong khi mảng kết hợp có thể sử dụng bất kỳ loại giá trị nào để chọn các phần tử mảng . Giá trị chỉ mục cho một mảng kết hợp được gọi là khóa. Hãy xem xét các ví dụ sau:

$ages("Bob") = 35; $ages("Mary") = 25; $, = " "; # thay đổi dấu tách đầu ra cho toán tử in print @ages("Bob","Mary"); # in phím in "25 35"(%ages); # sẽ in "Bob Mary" cho $name (keys(%ages)) ( print "$name is $ages($keys)\n"; )

Như bạn có thể thấy, chương trình gán giá trị cho biến "$," (một biến vô hướng có tên là dấu phẩy). Tập lệnh sử dụng biểu thức này để đảm bảo rằng đầu ra không bị trùng với nhau khi sử dụng câu lệnh in . Ở phần sau của chương này, các biến đặc biệt như "$," sẽ được thảo luận. Mảng kết hợp được xác định bằng dấu ngoặc nhọn. Cũng như mảng, chỉ mục không được sử dụng khi đề cập đến toàn bộ mảng kết hợp. Ví dụ: liên kết @ages("Bob", "Mary") sử dụng các chỉ mục được đặt trong ngoặc đơn để trỏ đến một mảng kết hợp. Tiền tố @ chỉ ra rằng đó là một mảng. Việc sử dụng tương tự ký hiệu đô la trước một mảng cho biết rằng một giá trị vô hướng đang được sử dụng.

Lưu ý: Nếu có hai khóa, thì cùng với ký hiệu @, khóa này cho biết đây là một phần của mảng kết hợp và kết quả phải ở dạng danh sách. Biểu thức này tương đương với #ages(" Bob"), #ages("Mary"). trong đó có giá trị (35, 25) là giá trị của nó.

Câu lệnh print keys(%ages) gọi câu lệnh keys, câu lệnh này trả về danh sách đầy đủ các khóa trong mảng kết hợp. Tham chiếu %ages có ký hiệu phần trăm làm tiền tố có nghĩa là tham chiếu đề cập đến toàn bộ mảng kết hợp. Lưu ý rằng vòng lặp for đề cập đến các biến được đặt trong dấu ngoặc kép. Cuối cùng, ví dụ cuối cùng mà chúng ta đã xem xét cũng sử dụng câu lệnh keys và giới thiệu một vòng lặp for để in ra tất cả các tổ hợp của một mảng kết hợp. Vòng lặp for đề cập đến các biến được đặt trong dấu ngoặc kép. Đến lượt mình, Perl sẽ thay thế các giá trị được tham chiếu bởi các biến tại thời điểm nó phân tích cú pháp chuỗi. Các lập trình viên gọi quá trình này là thay thế hoặc nội suy biến.

Lưu ý: Perl không diễn giải các biến chứa chuỗi trích dẫn đơn.

NGƯỜI ĐIỀU HÀNH PERL

Trong khi các kiểu dữ liệu và biến của Perl khá khác so với các kiểu C tương ứng, các toán tử và biểu thức của Perl có vẻ quen thuộc hơn nhiều với bạn. Tất cả các toán tử C đều có trong Perl, ngoại trừ toán tử ép kiểu (kiểu), toán tử để truy cập nội dung của con trỏ *ptr, và toán tử để chọn một thành viên của cấu trúc var.member hoặc var->member. Ngoài ra, Perl cung cấp nhiều toán tử mới để sử dụng trong các thao tác như so sánh và thao tác chuỗi.

TOÁN TỬ SỐ HỌC

Các toán tử số học tác động lên các giá trị số và cho kết quả là một số. Nếu biểu thức bao gồm các toán hạng chuỗi, thì Perl chuyển đổi các giá trị chuỗi thành giá trị số trước khi đánh giá biểu thức. Perl chuyển đổi chuỗi thành số giống như cách hàm atof() của C thực hiện trong thư viện thời gian chạy. Perl hiện hỗ trợ các toán tử số học sau:
- + bổ sung
- - trừ hoặc đổi dấu
- * phép nhân
- / phép chia (chỉ dành cho số dấu phẩy động)
- % modulo (chỉ dành cho giá trị số nguyên)

Xem xét các ví dụ sau các phép tính toán học Ngôn ngữ perl:

$x = 2,5; $y = 3; in ($x + 2*$y); # in 8,5 in (7 / $y); # in 2.3333333 in int (7 / $y); # in 2 in (7 % $y); # in 1 bản in (7.5 % $y); # bản in 1

Lưu ý: Trong Perl, toán tử chia luôn dẫn đến một số dấu phẩy động và lấy một số theo modulo một số khác dẫn đến một số nguyên và cả hai toán hạng trước tiên được chuyển đổi thành một loại số nguyên.

Xét phép toán modulo sau:

In(7,9% 3,6); # in 1 giống nhau (7 % 3) = 1

Perl cũng hỗ trợ các toán tử tăng và giảm:
- ++ giảm ở dạng tiền tố hoặc hậu tố
- - tăng ở dạng tiền tố hoặc hậu tố Hãy xem xét các ví dụ về các phép toán tăng và giảm:

$x = 4; ++$x; in $x; # in 5 $y = $x-; # giảm x sau khi gán cho y giá trị của x print "$y $x" # print 5 4

Cuối cùng, Perl cung cấp một toán tử số học cho phép lũy thừa (**). Xem xét các ví dụ sau về cách sử dụng phép toán lũy thừa:

$x = 2 ** 3; # kết quả 8 $x = 2 ** 0,5; # căn bậc hai của 2 $x = -2 ** -3; # 1/(-2 lập phương), kết quả -1/8 (-0,125)

NHÀ VẬN HÀNH BITwise

Toán tử bitwise ảnh hưởng đến đại diện nhị phân số nguyên và có kết quả là số nguyên. Nếu toán hạng là một chuỗi hoặc một số phân số, trước tiên Perl sẽ chuyển đổi nó thành một số nguyên và xử lý toán hạng bằng cách sử dụng biểu diễn 32 bit. Tất cả các toán tử bitwise C đều có trong Perl:
- | theo bit HOẶC
-& theo bit AND
- ^ XOR theo bit
- ~ đảo ngược bit
- << сдвиг влево
-> chuyển sang phải

Xem xét các ví dụ sau hoạt động bitwise:

$x = 5; # 101 ở dạng nhị phân $y = 3; # 011 ở dạng in nhị phân $x | $y; # 7 (111) in $x & $y; # 1 (001) in $x ^ $y # 6 (110) in $x & ~1; # 4 (100) bản in $x<< 2 # 20 (10100) print $x >> 1 # 2 (10)

Như trong C, hành vi của toán tử dịch phải phụ thuộc vào việc triển khai ngôn ngữ khi toán hạng âm.

TOÁN TỬ SO SÁNH

Toán tử so sánh so sánh giá trị của hai toán hạng. Giống như với các toán tử số học, Perl chuyển đổi toán hạng chuỗi thành toán hạng số trước khi thực hiện phép so sánh. Để cho phép một tập lệnh so sánh các chuỗi không phải là số, Perl có các toán tử so sánh chuỗi bổ sung. Các toán tử này so sánh các chuỗi sử dụng các giá trị ASCII. Nếu một giá trị số được đưa ra dưới dạng toán hạng trong phép so sánh chuỗi, thì trước tiên giá trị đó được chuyển đổi thành chuỗi. Bảng 12.1 liệt kê các toán tử so sánh:

Chuỗi số Ý nghĩa = = eq bằng!= ne không bằng > gt lớn hơn< it меньше чем >= ge lớn hơn hoặc bằng<= lе меньше или равно <=>cmp không bằng (kết quả đã ký)

Chuyển hướng. 12.1. Toán tử so sánh Perl.

Kết quả của thao tác so sánh là một nếu so sánh là đúng và bằng 0 nếu không. Tuy nhiên, hoạt động cuối cùng<=>hoặc cmp) có thể trả về -1, 0 hoặc 1 tùy thuộc vào việc giá trị của toán hạng thứ nhất nhỏ hơn, bằng hoặc lớn hơn toán hạng thứ hai.

Lưu ý: Toán tử cmp của Perl hoạt động giống như hàm Strcmp() của thư viện thời gian chạy C.

Xét ví dụ so sánh sau:

$x = 5; # x bằng 5 chữ in ($x< 4); # если false, то выведет 0

TOÁN TỬ LOGIC

Các toán tử Boolean phân tích các biểu thức boolean và trả về các giá trị<истинно>hoặc<ложно>kết quả là. Perl coi toán hạng của các phép toán logic là toán tử, tức là như giá trị true hoặc false.

Các toán tử logic của Perl bao gồm:


-|| logic HOẶC
- && logic VÀ

Perl luôn xử lý các biểu thức boolean từ trái sang phải. Bên cạnh đó. Perl luôn ngừng đánh giá nếu việc đánh giá đã được thực hiện là đủ để xác định giá trị của kết quả. Ngoài các toán tử logic chung, Perl hỗ trợ các toán tử logic bổ sung sau:


- ! phủ định logic ()
-
-: hoạt động có điều kiện
- , thực hiện tuần tự

Toán tử phủ định logic (!) thay thế giá trị của một giá trị Boolean bằng giá trị ngược lại của nó. Cũng giống như trong C, trong Perl toán tử điều kiện (
-:) sử dụng ba toán hạng. Một biểu thức sử dụng toán tử điều kiện có dạng sau:

Tình trạng
- kết quả đúng: kết quả sai

Tương tự, câu lệnh sau đây sử dụng toán tử có điều kiện để cấp cho Bob quyền truy cập đầy đủ và quyền truy cập hạn chế cho những người khác:

$access = ($user eq "Bob"
- "Đầy đủ" : "Hạn chế");

Câu lệnh thực thi tuần tự<,>(còn được gọi là toán tử dấu phẩy) không phải là toán tử logic hoàn toàn vì nó không phân tích giá trị thực của các toán hạng của nó. Perl thực hiện các toán hạng của toán tử thực hiện tuần tự từ trái sang phải và trả về giá trị của toán hạng ngoài cùng bên phải. Ví dụ sau minh họa việc sử dụng toán tử dấu phẩy trong vòng lặp for.

Đối với ($i=0, $j=10; $i<10; $i++, $j-) { print i$," ",$j }

DÂY CHUYỀN TỬ

Vì Perl là một ngôn ngữ xử lý văn bản nên không ngạc nhiên khi nó bao gồm các toán tử bổ sung để làm việc với các chuỗi. Các toán tử xử lý chuỗi được liệt kê dưới đây:
-. nối chuỗi
- sao chép x
- =~ khớp mẫu biến
- !~ giống như cái trước, nhưng có thêm phủ định của kết quả

Hai tuyên bố đầu tiên dễ dàng được minh họa bằng một ví dụ:

In "b" . "một" x 2 . "Một"; # in "chuối"

Như được hiển thị, biểu thức này sử dụng phép nối chuỗi và toán tử sao chép để in chuỗi .Hai toán tử cuối cùng được sử dụng để kiểm tra xem toán hạng chuỗi có bao gồm mẫu đã cho hay không. Vấn đề này được thảo luận chi tiết trong phần<Регулярные выражения>. Ví dụ sau minh họa việc sử dụng chúng:

$var = "chuối"; in ($var =~ /ana/)
- ĐÚNG SAI;

Trong trường hợp này, toán tử kiểm tra sự xuất hiện của chuỗi mẫu (=~) đã được sử dụng để kiểm tra xem mẫu ana có nằm trong biến $var hay không. Trong trường hợp này, biểu thức nhận giá trị<истинно>.

NGƯỜI ĐIỀU HÀNH CHỈ ĐỊNH

Nếu bạn đã quen thuộc với ngôn ngữ lập trình C, thì các dạng câu lệnh gán của Perl sẽ hoàn toàn quen thuộc với bạn. Cũng giống như trong C, các toán tử này khiến Perl thực hiện các thao tác đặc biệt trên các giá trị xuất hiện ở phía bên phải của toán tử và sau đó thực hiện một phép gán:

= += -= *= /= %= |= &= ^= ~= <<= >>= **= .= x=

GIÁ TRỊ Trong Perl, cũng như trong C, một giá trị là tên của bất cứ thứ gì ở phía bên trái của câu lệnh gán. Như vậy, một giá trị là một thực thể có thể được gán một giá trị, ví dụ, một giá trị có thể là một biến. Ví dụ: tập lệnh Perl không thể gán giá trị cho chuỗi ký tự như biểu thức = 32 vì không phải là một giá trị. Tuy nhiên, tập lệnh có thể gán một giá trị cho biến $Bob, chẳng hạn như $Bob = 32, vì biến $Bob là một giá trị. Trong Perl, bất kỳ thực thể nào có thể được sử dụng làm giá trị thường là một. Ví dụ: biểu thức sau đóng gói (pack) và giải nén (unpack) một danh sách các giá trị, với danh sách các biến trong trường hợp đầu tiên và ba đại lượng vô hướng trong trường hợp thứ hai là các giá trị:

@color = ($r, $g, $b); # gói màu ($r, $g, $b) = @color; # giải nén màu

Khi bạn làm việc với các danh sách trong Perl, câu lệnh gán không nhất thiết phải áp dụng cho toàn bộ danh sách. Tập lệnh có thể gán giá trị cho các mục danh sách riêng lẻ, như được hiển thị bên dưới:

@items = (100,200,300);

Trong trường hợp này, toán tử gán giá trị cho ba phần tử của danh sách. Tương tự, biểu thức sau giải nén các phần tử của một danh sách bằng cách gán giá trị của hai phần tử đầu tiên cho hai biến vô hướng và phần còn lại của mảng cho một biến danh sách:

($arg1,$arg2,@rest) = @ARGV; # bạn có thể kết hợp vô hướng và mảng

CÁC THAO TÁC LÀM VIỆC VỚI DANH SÁCH

Danh sách hoạt động bao gồm những điều sau đây:

Liệt kê hàm tạo - .. toán tử phạm vi - toán tử sao chép x

Bạn đã sử dụng hàm tạo danh sách để khởi tạo mảng và tạo danh sách các biến được sử dụng làm giá trị. Toán tử phạm vi trả về giá trị của nó là một chuỗi các số nguyên bắt đầu từ toán hạng bên trái và tiếp tục cho đến và bao gồm cả toán hạng bên phải. Các tập lệnh thường sử dụng toán tử phạm vi kết hợp với hàm tạo danh sách để tạo danh sách. Ví dụ: biểu thức sau sử dụng toán tử phạm vi để tạo danh sách có tên @digits chứa các số từ 0 đến 9:

@chữ số = 0..9; # danh sách (1,2,3,4,5,6,7,8,9)

Tương tự, biểu thức này có thể sử dụng toán tử phạm vi để tạo một dải các chỉ mục mảng Giả sử danh sách @days chứa các ngày trong tuần (bắt đầu bằng Chủ nhật). Biểu thức sau gán giá trị danh sách @weekdays từ Thứ Hai đến Thứ Sáu:

@cuối tuần = @ngày;

Cuối cùng, biểu thức sau sử dụng hai toán tử vùng để tạo danh sách các chữ số thập lục phân:

@hex_digits = (0..9,a..f);

Toán tử sao chép chỉ cần tạo các bản sao của toán hạng đã cho với số lần đã chỉ định. Ví dụ, trong biểu thức sau, danh sách các giá trị 1, 2, 3 được lặp lại ba lần:

CÁC TOÁN TỬ LÀM VIỆC VỚI TỆP

Perl có một danh sách đầy đủ các toán tử tệp. Có ít nhất 27 toán tử trả về thông tin cụ thể về tệp mà không cần mở tệp. Nhiều câu lệnh ngôn ngữ Perl được định hướng cho UNIX, nhưng các câu lệnh sau hoạt động trên bất kỳ hệ thống nào:

D kiểm tra sự tồn tại của thư mục
--e xác định xem tệp có tồn tại không
--s chỉ định kích thước tệp
--w xác định xem tệp đã cho có thể được ghi vào

Hai câu lệnh file tiếp theo trả về một giá trị boolean. Câu lệnh thứ ba trả về kích thước của tệp theo byte. Văn bản sau đây minh họa việc sử dụng các toán tử này:

Nếu (-e,"perl.exe") ( in "Kích thước tệp là:" -s "perl.exe"; ) khác ( in "can\" t find perl.exe\n"; ) (-w "SomeFile ") || die "Không thể ghi vào SomeFile\n";

ƯU TIÊN THI CÔNG CỦA NGƯỜI VẬN HÀNH

Giống như bất kỳ ngôn ngữ lập trình nào, Perl ưu tiên thực hiện các câu lệnh theo đó trình tự thực hiện của chúng được sắp xếp. Bảng 12.2 liệt kê thứ tự ưu tiên của toán tử từ cao nhất đến thấp nhất:


- ++
- ! ~ trừ đơn nguyên
- **
- =~ !~
- * / % X
- +
- <<>>
- -d -e -s -w (và các toán tử tệp khác)
- <> <= >= Nó gt le ge
- = = != < =>eq ne cmp
- &
- |^
- &&
- ||
- ..
-
- : = += -= *=

Chuyển hướng. 12.2. Ưu tiên toán tử Perl từ cao nhất đến thấp nhất

Trong tập lệnh của mình, bạn có thể thay đổi thứ tự thực hiện các câu lệnh bằng cách sử dụng dấu ngoặc đơn.

XÂY DỰNG PERL

Perl hỗ trợ tất cả các biểu thức ngôn ngữ C sử dụng định dạng gần như giống hệt nhau. Ví dụ, các cấu trúc điều khiển if, while, do. for và goto được sử dụng ở dạng giống nhau trong cả hai ngôn ngữ. Như bạn sẽ thấy ở phần sau, câu lệnh continue có ý nghĩa hơi khác trong Perl. Giá trị trước đây của nó bây giờ được gọi là tiếp theo và câu lệnh ngắt bây giờ được gọi là cuối cùng. Perl không triển khai câu lệnh chuyển đổi. Ngoài ra, một số biểu thức C có thể được tìm thấy trong Perl ở các định dạng khác và nhiều biểu thức mới đã được thêm vào.

TOÁN TỬ ĐƠN GIẢN VÀ TỔ HỢP

Một biểu thức đơn giản là bất kỳ sự kết hợp hợp lệ nào của toán tử và toán hạng. Trong Perl, một toán tử là một biểu thức kết thúc bằng dấu chấm phẩy. Như trong ngôn ngữ lập trình C, tất cả các câu lệnh kết thúc bằng dấu chấm phẩy. Khi bạn xuất văn bản chương trình cho trình gỡ lỗi, bạn có thể bỏ qua dấu chấm phẩy vì trình gỡ lỗi sẽ cung cấp dấu chấm phẩy cho bạn. Văn bản sau đây minh họa một câu lệnh gán Perl đơn giản:

$Title = "Lập trình Web"; !}

Giống như trong lập trình C, các tập lệnh Perl có thể chứa các khối câu lệnh hoặc các câu lệnh phức hợp, được đặt trong dấu ngoặc nhọn (()), như minh họa bên dưới:

( # Câu lệnh # Một khối câu lệnh khác )

Tập lệnh của bạn sẽ sử dụng rộng rãi các khối câu lệnh cùng với các câu lệnh phức tạp hơn. Giống như C, các tập lệnh Perl có thể sử dụng các khối câu lệnh để xác định phạm vi của các biến cục bộ. Tuy nhiên, định nghĩa của các biến cục bộ trong một khối không tự động. Để khai báo chúng, tập lệnh phải sử dụng từ khóa local Ở phần sau của chương này, chúng ta sẽ xem xét phạm vi biến một cách chi tiết.

HOẠT ĐỘNG CÓ ĐIỀU KIỆN

Nhiều ví dụ trước đã sử dụng câu lệnh if. Trong Perl, câu lệnh if gần giống với câu lệnh if trong C. Tuy nhiên, điểm khác biệt là trong C, câu lệnh if có thể sử dụng một câu lệnh đơn giản không có dấu ngoặc nhọn, trong khi ở Perl, các câu lệnh phải được đặt trong dấu ngoặc nhọn để tạo thành một khối. .

Câu lệnh if (expr); // chấp nhận được trong C nhưng không được chấp nhận trong Perl if (expr) ( câu lệnh; # đây là cách bạn thực hiện trong Perl )

Tương tự, câu lệnh other của Perl hoạt động hơi khác so với câu lệnh tương ứng C. Trong Perl, các câu lệnh cũng phải được đặt trong dấu ngoặc nhọn và tạo thành một khối:

// Một ví dụ trong C không được chấp nhận trong Perl if (expr1) statament1; khác nếu (expr2) câu lệnh2; khác stsment3;

Phần sau đây cho thấy Perl cho phép sử dụng cấu trúc elsif:

If (expr1) ( ststement1; ) elsif (expr2) ( câu lệnh2; ) other ( ststement3; )

TRỪ KHI NGƯỜI ĐIỀU HÀNH

Trong ngôn ngữ lập trình C, các lập trình viên sử dụng phép phủ định logic (!) để đảo ngược một giá trị boolean, như hình dưới đây:

If (!(expr)) // Phủ định trong câu lệnh C (; )

Cùng với việc sử dụng phủ định logic, các tập lệnh Perl thường chứa một câu lệnh trừ khi đạt được điều tương tự như mã C ở trên.

Trừ khi (expr) ( tuyên bố; )

Lưu ý: Không giống như C, Perl không chứa câu lệnh chuyển đổi.

LÀM NGƯỜI ĐIỀU HÀNH

Một trường hợp đặc biệt của câu lệnh khối là câu lệnh do, nó cho phép một khối câu lệnh trả về giá trị. Giá trị mà câu lệnh do trả về là giá trị của biểu thức cuối cùng được đánh giá trong khối. Ví dụ: câu lệnh do sau đây so sánh biến chuỗi $Month với các tháng trong năm và đặt biến $DayCount thành số ngày trong tháng:

$DayCount = do ( if ($Month eq "Tháng 9" || $Month eq "Tháng 4" || $Month eq "Tháng 6" || $Month eq "Tháng 11") ( 30; ) elsif ($Month eq "Tháng 2" ) ( $Năm & 3
- 28:29; # Kiểm tra năm nhuận ) else ( 31; ) );

Lưu ý rằng Perl yêu cầu dấu chấm phẩy ở cuối khối do. Đừng nhầm khối do với câu lệnh do while, điều này sẽ được thảo luận sau trong chương này.

CHU KỲ VÀ CHI NHÁNH

Perl hỗ trợ các câu lệnh vòng lặp for, while và do với những khác biệt nhỏ so với cách triển khai C. Sự khác biệt lớn là Perl yêu cầu các câu lệnh phải được sử dụng trong các khối được đặt trong dấu ngoặc nhọn. Ngoài ra, như bạn sẽ thấy tiếp theo, Perl mở rộng cấu trúc vòng lặp để cung cấp một số dạng mới cho nó. Trong các ví dụ sau, các vòng lặp for, while và do hoạt động tương tự trong C và Perl:

Cho($i = 0; $i< 100;$i++) { printf("%d\n", $i) ; } while ($i >0) ( printf("%d\n", $i-); ) làm ( printf("%d\n", $i++); ) trong khi ($i< 0);

Cấu trúc vòng lặp trong C khác với cấu trúc trong Perl ở chỗ Perl không chứa câu lệnh ngắt, trong khi câu lệnh tiếp tục thực hiện một chức năng hoàn toàn khác. May mắn thay, Perl cung cấp một số cấu trúc mới, linh hoạt hơn và trực quan hơn:


- thoát khỏi vòng lặp cuối cùng (như câu lệnh ngắt C)
- tiếp theo bắt đầu một bước lặp mới (như câu lệnh continue trong C)
- làm lại lặp lại lần lặp hiện tại

Để hiểu cấu trúc vòng lặp của Perl, cần phải hiểu việc sử dụng khối continue. Xem xét vòng lặp while sau, chứa khối continue:

$i = 100; trong khi ($i > 0) ( in $i; ) tiếp tục ($i-)

Bạn có thể coi khối continue là câu lệnh thứ ba trong vòng lặp for, được thực thi trên mỗi lần lặp. Tương tự, Perl thực thi khối continue ở cuối mỗi lần lặp. Tuy nhiên, như bạn sẽ tìm hiểu sau, khối continue cung cấp cho tập lệnh nhiều quyền kiểm soát hơn đối với quy trình so với vòng lặp for. Khi một vòng lặp Perl sử dụng câu lệnh next, khối continue vẫn được thực thi nếu nó tồn tại. Tuy nhiên, nếu vòng lặp sử dụng câu lệnh làm lại, thì khối tiếp tục không được thực thi.

NHÃN

Trong tập lệnh Perl, nhãn chỉ có nghĩa là tên tương ứng với vị trí nào đó trong tập lệnh. Tên nhãn kết thúc bằng dấu hai chấm (ví dụ: vòng lặp ngoài:). Sử dụng câu lệnh goto, tập lệnh có thể chuyển đến nhãn. Ngoài ra, các toán tử last, next và redo có thể được sử dụng để chuyển đến nhãn. Đoạn mã sau minh họa việc sử dụng toán tử last để chuyển đến nhãn:

Vòng ngoài: while ($i > 0) ( while ($j > 0) ( #Một số quy trình khác ở đây if ($needToAboutLoop) ( vòng ngoài cuối cùng; ) ) )

Trong trường hợp này, lệnh chứa nhánh cuối cùng để nhảy tới đường viền của vòng ngoài và kết thúc vòng lặp.

CHO ĐẾN KHI VÒNG

Một cấu trúc vòng lặp khác trong Perl là vòng lặp until, vòng lặp này ngược lại với vòng lặp while. Như bạn còn nhớ, trong một vòng lặp while, các câu lệnh được thực hiện miễn là điều kiện đã chỉ định là đúng. Mặt khác, trong một vòng lặp cho đến khi các câu lệnh được thực hiện cho đến khi điều kiện được đáp ứng. Ví dụ, hãy xem xét một vòng lặp while chẳng hạn như vòng lặp hiển thị trên trang tiếp theo.

While (!(expr)) ( câu lệnh; )

Sử dụng vòng lặp cho đến khi bạn có thể tạo vòng lặp giống hệt như bên dưới:

cho đến khi (expr) ( tuyên bố; )

Tương tự, cấu trúc do while sau đây sử dụng toán tử phủ định logic để lặp cho đến khi biểu thức boolean đã cho có giá trị đúng:

Do ( câu lệnh; ) while (!(expr));

Sử dụng cấu trúc do until, bạn có thể tạo một vòng lặp giống hệt nhau mà không cần sử dụng phép phủ định logic:

Làm (câu lệnh; ) cho đến khi (expr);

VÒI FOR VÀ FOREACH

Perl hỗ trợ vòng lặp for giống hệt như C:

For (câu lệnh1; biểu thức; câu lệnh2) ( câu lệnh3; )

Ví dụ: đoạn mã sau sử dụng vòng lặp for để in giá trị của các số từ 0 đến 100:

Đối với ($chữ số = 0; $chữ số<=100; $digit++) { print $digit, " "; }

Ngoài ra, Perl cung cấp cấu trúc vòng lặp foreach cho phép tập lệnh lặp qua danh sách và mảng. Hãy xem xét một ví dụ:

@list = ("a","b","c"); foreach $arg (@list) ( print "List item: $arg\n"; ) foreach $i (1..10) ( print "iteration $i\n" )

Trong trường hợp đầu tiên, vòng lặp foreach lặp qua các giá trị của biến danh sách @list. Trong ví dụ thứ hai, vòng lặp foreach lặp qua các số trong phạm vi từ 1 đến 10. Vòng lặp foreach có thể chứa danh sách các ký tự hoặc một mảng, như được minh họa trong ví dụ trước. Sau một lần lặp của vòng lặp, một biến vô hướng đặc biệt ($arg trong trường hợp đầu tiên và $i trong trường hợp thứ hai) nhận một giá trị từ danh sách các phần tử đã cho. Phạm vi của biến vô hướng này trong vòng lặp foreach được giới hạn trong phần thân của vòng lặp. Do đó, một biến vòng lặp vô hướng, foreach, sẽ không xung đột với một tên biến giống hệt được xác định bên ngoài vòng lặp. Đoạn mã sau sử dụng một biến có tên $i bên trong và bên ngoài vòng lặp foreach:

$i = 1001; foreach $i (1..9) ( print "$i\n"; # loop print 123456789 ) print "$i\n";

Như bạn có thể thấy từ ví dụ này, biến $i được sử dụng để lặp lại vòng lặp không xung đột với biến $i được xác định bên ngoài vòng lặp. Một tính năng của vòng lặp foreach mà tập lệnh của bạn có thể sử dụng là khả năng sửa đổi các phần tử mảng.

@list = 1..5; foreach $i (@list) ($i += 10; ) $, = " "; in @ danh sách; # in 11 12 13 14 15

Hãy đưa ra một vài nhận xét cuối cùng về vòng lặp foreach. Trong Perl, tên foreach và for được coi là từ đồng nghĩa. Do đó, các tập lệnh có thể sử dụng các tên này thay thế cho nhau. Ngược lại, Perl sẽ xác định loại vòng lặp dựa trên ngữ cảnh của nó.

TOÁN TỬ GOTO KHÔNG ĐIỀU KIỆN

Perl hỗ trợ toán tử goto, toán tử này giống hệt với toán tử ngôn ngữ lập trình C. Sau đây là một ví dụ về việc sử dụng toán tử goto để hiển thị các số từ 1 đến 10:

$i = 1; vòng lặp: in $i++, " "; nếu ($i<=10) { goto loop; }

BỘ SỬA ĐỔI HOẠT ĐỘNG

Perl sử dụng các dạng đặc biệt của các cấu trúc if, trừ khi, trong khi và cho đến khi kiểm soát luồng tính toán. Trong một số trường hợp nhất định, các cấu trúc đặc biệt này có thể làm cho mã của bạn rõ ràng và dễ đọc hơn. Để làm cho mã dễ đọc hơn và ý nghĩa của nó rõ ràng hơn, nên chọn một định dạng thích hợp để ghi. Hãy xem xét biểu thức sau, biểu thức này sử dụng hàm die để kết thúc tập lệnh nếu giá trị của biến $count nhỏ hơn 10:

Nếu ($đếm< 10) { die; }

Đặt hàm die trước câu lệnh if, như minh họa bên dưới, sẽ giảm số lượng dòng mã:

Chết nếu ($count< 10);

Tương tự, biểu thức tương tự có thể được viết như sau:

($count >= 10) || chết;

Trong trường hợp này, nếu biến $count lớn hơn hoặc bằng 10, Perl dừng đánh giá thêm trên dòng này và hàm die không được thực thi. Mặt khác, nếu biến $count nhỏ hơn 10, sau phần đầu tiên của biểu thức được đánh giá, mã sẽ chạy hàm die và do đó kết thúc quá trình thực thi tập lệnh . Cuối cùng, trong ví dụ sau, việc sử dụng cấu trúc unless cũng làm giảm số dòng xuống còn một:

Chết trừ khi ($count >= 10);

Tương tự, các vòng lặp while sau giống hệt nhau:

$i = 0; trong khi ($i< 10) { $i++; } $i = 0; $i++ while ($i < 10);

Như bạn có thể thấy, bằng cách sử dụng sửa đổi cấu trúc, tập lệnh cho phép bạn giảm số dòng trong bản ghi vòng lặp xuống một dòng. Tương tự, các vòng lặp until sau đây là tương đương:

$i = 10; cho đến khi ($i >= 10) ( $i++; ); $i = 10; $i++ cho đến ($i >=10);

Lưu ý: Trong cả bốn trường hợp, ngay cả khi biểu thức được đánh giá là sau câu lệnh thực thi, Perl trước tiên đánh giá điều kiện trước khi thực hiện câu lệnh.

TẠO BIỂU HIỆN ĐỘNG VỚI CHỨC NĂNG EVAL

Bởi vì Perl là một ngôn ngữ thông dịch, tập lệnh của bạn có thể sử dụng Perl để tạo mã.<налету>, tức là động, trong quá trình thực thi tập lệnh. Đây chính xác là cách hoạt động của trình gỡ lỗi Perl (bản thân nó là một chương trình Perl có tên là Perldb.PL). Khi thiết kế tập lệnh, bạn có thể sử dụng mã động như vậy để tạo tên biến động hoặc thậm chí xây dựng chương trình con tùy chỉnh. Perl đánh giá các biểu thức động bằng hàm eval. Ví dụ sau đây tạo một lệnh động bằng cách gán một giá trị cho một biến văn bản chứa lệnh Perl được yêu cầu. Các hướng dẫn sau sử dụng hàm eval để thực hiện lệnh này:

$perl_statement = "in "Xin chào, thế giới\n";"; eval $perl_statement; # print Xin chào, thế giới $i = 1001; $varname = "$i"; in eval $varname; # in giá trị của $i

Lưu ý: Sử dụng hàm eval bằng tập lệnh có nhiều nguy hiểm, đặc biệt nếu tập lệnh chuyển dữ liệu nhận được từ người dùng sang hàm eval. Sử dụng hàm eval, một tập lệnh có thể thực thi một lệnh Perl tùy ý, kể cả các lệnh hệ thống. Điều này cho phép người dùng kiểm soát chương trình, điều này có thể đặc biệt rủi ro trên Internet và Web.

CHƯƠNG TRÌNH CON

Giống như tất cả các ngôn ngữ lập trình có cấu trúc, Perl hỗ trợ chương trình con. Một chương trình con có thể được xác định bằng cách sử dụng từ khóa phụ, như hình dưới đây:

Sub demo_sub ( in "demo_sub được gọi là\n"; ) &demo_sub; # lệnh gọi chương trình con

Trong trường hợp này, các hướng dẫn tạo thành một chương trình con gọi là demo_sub. Để gọi một chương trình con, tập lệnh đặt dấu và (&) trước tên chương trình con. Khi gọi chương trình con trong Perl, có thể bỏ qua dấu ngoặc đơn. Bạn có thể đặt chương trình con ở bất kỳ đâu trong mã nguồn của tập lệnh, bởi vì Perl sẽ phân tích cú pháp tất cả mã nguồn trước khi thực thi tập lệnh. Có thể khai báo một chương trình con trong mã nguồn ngay sau lần sử dụng đầu tiên của chương trình con (tham chiếu chuyển tiếp). Chương trình con có thể nhận đối số và trả về giá trị. Đoạn mã sau chứa chương trình con có tên show_value hiển thị giá trị mà chương trình con nhận được dưới dạng tham số:

Sub show_value ( print "The value id ", $_; ) &show_value(1001);

Chính thức, một chương trình con Perl không khai báo các biến để lưu trữ các đối số. Thay vào đó, một biến mảng có tên @_ được chuyển đến chương trình con chứa các giá trị tham số. Đổi lại, chương trình con truy cập các giá trị đối số bằng cách sử dụng ký hiệu sau cho các phần tử mảng: $_, $_, v.v. Tuy nhiên, cách truyền tham số này có thể làm giảm khả năng đọc mã và do đó hầu hết các chương trình con đều sử dụng cách sao chép của các đối số thành các biến cục bộ. Tương tự như ví dụ trước, chương trình con show_fwo_values ​​sau hiển thị giá trị của hai tham số:

Show_two_values ​​phụ ( print "Tham số thứ nhất ", $_, "\n"; print "Tham số thứ hai ", $_, "\n"; ) &show_two_values(1001, 2002);

Cuối cùng, hàm show_all_values ​​sau in giá trị của tất cả các tham số mà nó nhận được. Hàm sử dụng một mảng để xác định một số làm tham số:

Sub show_all_values ​​( for ($i = 0; $i< @_; $i++) { print "Parametr ", $i, " is ", $_[$i], "\n"; } } & show_all_values(1001,2002,3003,4004);

Như đã đề cập, chương trình con Perl có thể trả về giá trị. Đối với điều này, câu lệnh return được sử dụng. Không giống như C, Perl không yêu cầu sử dụng câu lệnh trả về. Nếu chương trình con không chứa câu lệnh trả về, thì biểu thức cuối cùng được đánh giá sẽ được lấy làm giá trị trả về. Ví dụ sau thêm hai tham số và trả về kết quả:

Sub_values ​​( return $_ + $_; ) print "Kết quả là: ", &add_values(1001,2002);

THƯ VIỆN CHƯƠNG TRÌNH CON

Ngược lại với C, Perl không thực sự hỗ trợ khái niệm thư viện. Tuy nhiên, nó cung cấp một cơ chế cho phép các tập lệnh sử dụng mã nguồn từ một tệp khác.Ví dụ: giả sử bạn lưu trữ thủ tục add_valuesl trong một tệp có tên addvalue.pl. Sử dụng câu lệnh yêu cầu, tập lệnh Perl khác có thể truy cập chương trình con đó, như minh họa bên dưới:

Yêu cầu "advalue.pl"; in &add_values(10,11);

Bạn có thể nghĩ về một câu lệnh yêu cầu tương tự như câu lệnh #include của bộ tiền xử lý C. Để tìm một tệp nguồn, trước tiên Perl tìm trong thư mục mặc định cho thư viện ngôn ngữ Perl (xem hướng dẫn cài đặt để biết chi tiết), rồi trong thư mục thư mục hiện tại. Bạn cũng có thể sử dụng đường dẫn tuyệt đối hoặc tương đối có nối thêm tên tệp. Perl ghi nhớ những tệp nào được yêu cầu bởi câu lệnh yêu cầu và chỉ tải chúng một lần, ngay cả khi những tệp đó được truy cập nhiều lần. Có nhiều thư viện tiêu chuẩn mở rộng khả năng của ngôn ngữ Perl. Bây giờ là thời điểm tốt để lướt qua thư mục lưu trữ các tệp thư viện ngôn ngữ Perl để có ý tưởng về các khả năng mà chúng cung cấp.

SỬ DỤNG CÁC GÓI ĐỂ TÁCH CÁC CHƯƠNG TRÌNH CON

Nếu bạn có nhiều chương trình con, đặc biệt là các chương trình con mà bạn lưu trữ trong các tệp khác nhau, xung đột tên biến có thể xảy ra khi cùng một tên biến được sử dụng cho các mục đích khác nhau. Perl giúp tránh điều này với các gói. Như bạn đã biết, bằng cách khai báo các biến cục bộ cho chương trình con, bạn có thể tránh xung đột tên. Tuy nhiên, nếu một số thường trình chia sẻ một số dữ liệu cụ thể, thì dữ liệu này có thể yêu cầu phạm vi toàn cầu, điều này có thể dẫn đến xung đột tên. không nhìn thấy được, tức là không rõ. Xem xét ví dụ đơn giản sau, trong đó hai thường trình (trong các tệp khác nhau) sử dụng các không gian tên riêng, riêng biệt.

# Mã trong tệp một.pl sub sub_one ( gói demo_one; $some_data = 10; ) # * * * * * * * * # Mã trong tệp hai.pl sub sub_one ( gói demo_two; $some_data = 20; )

Như bạn có thể thấy, chương trình con đầu tiên sử dụng tên gói demo_one, chương trình con thứ hai sử dụng tên gói demo_two. Cả hai chương trình con đều có thể đặt và sử dụng biến $some_data mà không gây xung đột tên giữa biến toàn cục này với biến toàn cục kia. Kịch bản<знает>tên của gói mà biến nằm trong đó và nó tổ chức quyền truy cập vào nó, sử dụng tên gói làm tiền tố cho tên biến. Ví dụ sau thêm tên gói package_one hoặc package_two làm tiền tố cho tên biến some_data:

&sub_one; &sub_two; in "Biến 1 $package_one"some_data\n" in "Biến 2 $package_two"some_data\n"

Khi bạn sử dụng các gói ngôn ngữ Perl, bạn có thể tạo một không gian tên duy nhất trong tệp nguồn hiện tại bằng cách đặt một câu lệnh gói ở đầu tệp, như minh họa bên dưới:

Gói some_package_name $some_data = 1; phụ some_sub ( return $some_data; )

Trong trường hợp này, biến $some_data chỉ tồn tại trong gói và do đó được bảo vệ khỏi truy cập sai. Do đó, việc sử dụng một gói cung cấp dữ liệu có cùng phạm vi như trong ngôn ngữ lập trình C, trong đó các biến toàn cục được đặt trong phạm vi tệp nguồn mà chúng được khai báo. Khi gọi một chương trình con từ một tập lệnh khác, bạn phải sử dụng tên gói:

Yêu cầu "some_package.pl"; in &some_package_name"some_sub;

XỬ LÝ HÀNG

Trong các ví dụ trước, bạn đã học cách xây dựng các chuỗi ký tự bằng cách sử dụng phép nội suy biến. Bạn cũng đã học cách nối chuỗi ký tự và biến chuỗi.Trong phần này, bạn thấy rằng Perl cung cấp một tập hợp lớn các hàm mà tập lệnh có thể sử dụng để thao tác chuỗi.

CHỨC NĂNG CHOP

Hàm chop loại bỏ ký tự cuối cùng của chuỗi. Nó có định dạng sau:

$character = chop(Str);

Hàm chop trả về ký tự đã xóa. Các tập lệnh Perl sử dụng rộng rãi chop để loại bỏ ký tự xuống dòng và ký tự cuối dòng.

CHỨC NĂNG CHỈ SỐ

Hàm chỉ mục tìm kiếm một chuỗi con đã cho trong một chuỗi. Nó có định dạng sau:

$location = index(Str, SubStr[, Offset]);

Hàm chỉ mục trả về chỉ mục của lần xuất hiện đầu tiên của chuỗi con(SubStr) trong chuỗi(Str). Theo tùy chọn, có thể chỉ định phần bù từ đầu (Offset), sau đó quá trình tìm kiếm bắt đầu. Nếu không tìm thấy chuỗi con, -1 được trả về. Trong ví dụ sau, hàm chỉ mục tìm kiếm các lần xuất hiện của chuỗi con "pa" sau ký tự thứ ba trong chuỗi "banana":

In index("chuối","na",3); # Đầu ra 4.

CHỨC NĂNG RINDEX

Hàm rindex tìm kiếm sự xuất hiện cuối cùng, ngoài cùng bên phải của một chuỗi con trong một chuỗi và trả về vị trí của ký tự đầu tiên của chuỗi con. Hàm có dạng sau:

$location = rindex(Str, SubStr);

Hàm này tương tự như hàm chỉ mục, ngoại trừ việc nó trả về lần xuất hiện cuối cùng chứ không phải lần đầu tiên. Ví dụ: ví dụ sau sử dụng hàm rindex để xác định lần xuất hiện cuối cùng của chuỗi con "na" trong chuỗi "banana":

In rindex("chuối","na"); # Đầu ra 4

CHỨC NĂNG ĐỘ DÀI

Hàm độ dài trả về số lượng ký tự trong một chuỗi. Nó có định dạng sau:

$len = độ dài(Str);

Ví dụ sau sử dụng hàm độ dài để in số ký tự trong một chuỗi:

chiều dài in ("chuối"); # Đầu ra 6

CHỨC NĂNG CƠ SỞ

Hàm substr được sử dụng để loại bỏ một phần của chuỗi. Nó có định dạng sau:

$substring = substr(Str, Offset[,Len]);

Hàm trả về một chuỗi con, tức là một phần của chuỗi có độ dài không vượt quá giá trị được chỉ định bởi tham số Len tùy chọn. Chuỗi con được trả về của str bắt đầu từ ký tự ở vị trí được chỉ định bởi Offset. Nếu tham số Len bị bỏ qua, thì chuỗi được trả về chứa các ký tự đến và bao gồm cả phần cuối của chuỗi. Nếu tham số Offset là số âm, thì phần bù được tính từ phần cuối của chuỗi. Cuối cùng, tập lệnh có thể sử dụng chất nền làm giá trị để thực hiện thao tác gán. Đoạn mã sau minh họa việc sử dụng hàm substr.

In chất nền("cam",3); #Prints "nge" print substr("orange",-2); # In "ge" print substr("orange",2,2); # In ra "an" $str = "apple"; chất nền($str,-3) = "ricot"; in $str; # In "hoa mai"

Lưu ý: Thông thường, việc sử dụng các toán tử ngôn ngữ Perl cho các biểu thức chính quy sẽ hiệu quả hơn các hàm cơ sở. Biểu thức chính quy được thảo luận sau trong chương này.

THAM GIA CHỨC NĂNG

Hàm nối nối một danh sách các phần tử thành một chuỗi, tách từng phần tử bằng một ký tự nhất định. Nó có định dạng sau:

$new_string = tham gia(Str,Danh sách);

Hàm nối chuyển đổi từng phần tử của danh sách thành một chuỗi và nối các chuỗi. Đoạn mã sau minh họa việc sử dụng hàm nối:

$str = tham gia(",", 0..4,10,20); # Danh sách sẽ là "0,1,2,3,4,10,20" $strn = join("\t", $a, $b, $c);# Trộn danh sách

CHỨC NĂNG TÁCH

Hàm split tách nội dung của một chuỗi thành một danh sách các phần tử. Nó có định dạng sau:

Tách(Dấu phân cách, Str[,Giới hạn]);

Đối số Dấu phân cách chỉ định ký tự cần tách, chẳng hạn như dấu cách, từ, tab, v.v. e. Tham số tùy chọn Giới hạn chỉ định số phần tử tối đa mà danh sách có thể chứa. Ví dụ sau minh họa việc sử dụng hàm tách.

CÁC CHỨC NĂNG XỬ LÝ DANH SÁCH

Trong các ví dụ trước đó của chương này, chúng ta đã thấy cách tạo một danh sách, lưu trữ nó dưới dạng giá trị của một biến, lặp qua tất cả các phần tử của danh sách và truy cập một phần tử danh sách riêng lẻ. Trong phần này, bạn sẽ tìm hiểu thêm một số tính năng giúp mở rộng phạm vi khả năng làm việc với danh sách.

CHỨC NĂNG ĐẢO LƯỢC

Hàm đảo ngược đảo ngược các phần tử của danh sách. Nó có định dạng sau:

@new_list = đảo ngược(@List);

Hàm đảo ngược đảo ngược danh sách và trả về một danh sách kết quả mới. Ví dụ sau minh họa việc sử dụng hàm đảo ngược:

@list = đảo ngược (1..5); # Kết quả 5,4,3,2,1 @list = reverse(@list); # Kết quả 1,2,3,4,5

CHỨC NĂNG SẮP XẾP

Hàm sắp xếp sắp xếp các phần tử của danh sách. Nó có định dạng sau:

@new_list = sắp xếp(@List);

@new_list = sắp xếp(Chương trình con @List);

@new_list = sắp xếp (BlockStatement @List);

Hàm sắp xếp sắp xếp các phần tử trong một danh sách bằng cách sắp xếp chúng theo thứ tự của ký tự trong bảng mã ASCII. Giống như hàm đảo ngược, hàm sắp xếp trả về một danh sách mới làm giá trị của nó và không ảnh hưởng đến danh sách ban đầu. Ví dụ sau minh họa việc sử dụng hàm sắp xếp:

@list = sắp xếp(1,5,2,3,4); # Kết quả 1,2,3,4,5 @list = sort(1,2,10); # 1,10,2 sắp xếp trong ASCII

Trong một chương trình con hoặc khối, bạn có thể thay đổi thứ tự theo đó việc sắp xếp được thực hiện. Ví dụ sau minh họa việc sử dụng hàm sắp xếp.

@list = sắp xếp(($a<=>$b) (2,1,10)); # @list 1,2,10 @list = sắp xếp(($b<=>$a)) (2,1,10); # @list 10,2,1 sub mycomp ($b<=>$a ) @list = sắp xếp(mycomp(2,1,10)); # @list10,2,1

HÀM Mảng

Như các bạn đã biết, mảng là một cấu trúc dữ liệu chứa một hoặc nhiều giá trị cùng kiểu, ví dụ 100 tên sinh viên. Perl có một số hàm dựng sẵn giúp bạn làm việc với các phần tử mảng. Các phần sau đây đề cập đến một vài hàm xử lý mảng cơ bản.

CHỨC NĂNG PUSH VÀ POP

Các tập lệnh Perl sử dụng các tiểu thuyết đẩy và bật để thêm và xóa các phần tử khỏi phần cuối của một mảng. Nói cách khác, các chức năng đẩy và bật cho phép các tập lệnh thực hiện các thao tác ngăn xếp trên cơ sở nhập sau, xuất trước. Hàm đẩy có định dạng sau:

Đẩy (@ARRAY, DANH SÁCH);

Đoạn mã sau minh họa việc sử dụng chức năng đẩy:

@list=(); đẩy(@list,10,20); # @list hiện là (10,20) push(@list,1..3); # @list hiện là (10,20,1,2,3)

Ngược lại, hàm pop loại bỏ phần tử được đẩy lần cuối vào ngăn xếp và trả về giá trị của phần tử đó. Hàm pop có định dạng sau:

$value = pop(@ARRAY);

Đoạn chương trình sau minh họa việc sử dụng hàm pop:

# Lấy @list từ ví dụ trước print pop(@list); # In 3 in pop(@list); # Đầu ra 2 # Bây giờ @list (10,20)

CHỨC NĂNG SHIFT

Hàm shift loại bỏ và trả về một phần tử từ đầu mảng. Hàm này tương tự như hàm pop, chỉ khác là nó hoạt động từ đầu mảng theo nguyên tắc FIFO (<первым вошел, первым вышел>). Hàm shift có dạng sau:

$value = shift(@ARRAY);

Đoạn chương trình sau minh họa việc sử dụng hàm shift:

# Lấy @list từ ví dụ trước

Printshift(@list); # Ca in 10 in(@list); # Đầu ra 20 # Bây giờ @list()

CHỨC NĂNG UNSHIFT

Hàm unshift thêm một hoặc nhiều phần tử vào đầu mảng. Nó có đoạn mã sau:

Unshift(@Array, Danh sách);

Đoạn chương trình sau minh họa việc sử dụng hàm unshift:

# @list = () unshift(@list,5,10,20); # @list (5,10,20) unshift(@list, 1..3); # @list(1,2,3,5,10,20)

CHỨC NĂNG NỐI

Các tập lệnh Perl sử dụng hàm nối để trích xuất các phần tử từ danh sách, thay thế chúng bằng các phần tử của danh sách khác. Nó có định dạng sau:

Splice(@Array, Offset[, Count[, List]]);

Hàm mối nối trích xuất số lượng phần tử (Count) đã chỉ định từ mảng (@Array), bắt đầu từ phần tử được chỉ ra bởi giá trị offset (Offset) và thay thế các phần tử này bằng các phần tử của danh sách khác (List). Nếu tham số Count không được chỉ định trong lệnh gọi hàm, hàm sẽ trích xuất các phần tử cho đến cuối mảng. Nếu lời gọi hàm không chỉ định một danh sách có các phần tử thay thế các phần tử ban đầu, thì hàm sẽ không thêm bất kỳ phần tử nào vào danh sách ban đầu. Biểu thức sau đây minh họa việc sử dụng hàm mối nối:

@list = 1..10; nối(@list,1,8,5,6); # @list = (1,5,6,10)

Hàm vô hướng

Hàm vô hướng xác định số lượng phần tử trong danh sách. Nó có định dạng sau:

Rsult = vô hướng (Danh sách);

Thông thường, các tập lệnh Perl không cần sử dụng hàm vô hướng với mảng, bởi vì khi tập lệnh truy cập một mảng, viết nó trong ngữ cảnh vô hướng, nó sẽ lấy số phần tử mảng làm giá trị trả về. Tuy nhiên, các tập lệnh có thể sử dụng hàm vô hướng trong trường hợp bối cảnh không rõ ràng hoặc nếu danh sách không phải là một mảng. Biểu thức sau minh họa việc sử dụng hàm vô hướng.

@list = 1..10; máy in chia tỷ lệ (@list); # Hiển thị kích thước của @list

CHỨC NĂNG GREP

Hàm grep lọc các phần tử của danh sách mà biểu thức đã cho ước tính thành một giá trị<ложно>. Nó có định dạng sau:

@list = grep(Biểu thức, Danh sách);

Hàm grep lặp qua các phần tử của danh sách, thay thế chúng làm đối số trong một biểu thức đã cho. Hàm grep gán biểu thức mục danh sách hiện tại cho $_ và đánh giá biểu thức đã cho. Nếu biểu thức kết quả là đúng, thì hàm grep sẽ thêm phần tử đó vào danh sách kết quả. Đoạn chương trình sau đây minh họa việc sử dụng hàm grep:

@list = grep($_ & 1, 1..10); # @list(1,3,5,7,9) @list = ("a","""b"); # @list("a"," ","b") @list = grep($_eq "", @list); # @list("a","b")

Lưu ý: Nếu một biểu thức, sửa đổi biến. $_, thì danh sách ban đầu cũng sẽ được sửa đổi.

CÁC HÀM Mảng KẾT HỢP

Như bạn đã biết, mảng kết hợp là mảng có chỉ số không phải là giá trị số mà là tên chẳng hạn. Perl có một số hàm dựng sẵn giúp các tập lệnh xử lý các mảng kết hợp dễ dàng hơn.

CÁC PHÍM CHỨC NĂNG

Hàm keys trả về giá trị của các key tương ứng với mảng kết hợp. Nó có định dạng sau:

@key_list = phím(%Array);

Hàm keys trả về một mảng các phím dưới dạng danh sách thông thường. Đoạn chương trình sau minh họa việc sử dụng hàm keys:

$ages("Bob") = 25; $ages("Mary") = 30; $ages("Zack") = 15; @list = keys(%ages); # @list sẽ là "Zack", "Bob", "Mary" @list = phím sắp xếp %ages # @ list "Bob", "Mary", "Zack" cho $key (phím sắp xếp %ages) ( print "$ khóa là $ages($key)\n" )

HÀM GIÁ TRỊ

Hàm giá trị trả về một mảng thông thường bao gồm các giá trị của mảng kết hợp. Nó có định dạng sau:

@value_list = giá trị(%Array)

Hàm các giá trị trả về một mảng các giá trị mảng kết hợp như một danh sách thông thường. Đoạn chương trình sau minh họa việc sử dụng hàm giá trị:

# Sử dụng các giá trị từ ví dụ trước %ages = ("Bob", 25, "Mary", 30, "Zack", 15); @list = giá trị sắp xếp %ages; # @list (15, 25, 30) @list = %ages; # @list("Zack", 15, "Bob", 25, "Mary", 30)

TỪNG CHỨC NĂNG

Mỗi hàm lặp qua các phần tử trong một mảng kết hợp. Nó có định dạng sau:

@key_values ​​= each(%Array);

Bất cứ khi nào tập lệnh gọi hàm each, nó sẽ trả về danh sách hai thành phần chứa cặp khóa-giá trị. Khi hàm đến cuối danh sách, nó sẽ trả về một danh sách trống. Lần tiếp theo hàm được gọi, quá trình lặp lại sẽ bắt đầu lại từ đầu. Đoạn chương trình sau đây minh họa việc sử dụng từng chức năng:

# Sử dụng các giá trị từ ví dụ trước %ages = ("Bob", 25, "Mary", 30, "Zack", 15); while (($name, $age) = each %ages) ( # Độ tuổi đầu ra in "$key is $ages($key)\n"; )

CHỨC NĂNG XÓA

Hàm xóa xóa các phần tử của một mảng kết hợp. Nó có định dạng sau:

Xóa $Array(Khóa)

Câu lệnh sau đây sử dụng hàm xóa để xóa phần tử tương ứng với khóa Bob khỏi mảng kết hợp $Employees:

Xóa $Employees("Bob")

LỆNH DÒNG LỆNH

Thật dễ dàng để các tập lệnh Perl truy cập các đối số dòng lệnh. Bất cứ khi nào một tập lệnh được chạy, Perl sẽ đặt các đối số dòng lệnh của tập lệnh vào biến danh sách @ARGV. Đoạn chương trình sau được sử dụng để in các đối số dòng lệnh ra màn hình:

While ($arg = shift @ARGV) ( print "$arg\n"; )

TIẾP CẬN BIẾN MÔI TRƯỜNG

Việc truy cập các biến môi trường trong tập lệnh Perl cũng rất dễ dàng. Bất cứ khi nào một tập lệnh được chạy, Perl sẽ đặt các bản sao của các biến môi trường vào một mảng kết hợp có tên là %ENV. Câu lệnh sau sử dụng mảng %ENV để hiển thị thư mục hiện tại:

In "$ENV(PATH)\n"; # Hiển thị thư mục hiện tại

Ngoài việc nhận các giá trị từ mảng %ENV, các tập lệnh cũng có thể sửa đổi các thành phần của mảng. Những thay đổi như vậy đối với mảng %ENV sẽ thay đổi cài đặt biến môi trường cho bất kỳ tiến trình con nào được tạo bởi tập lệnh. Ví dụ, hướng dẫn tiếp theo sử dụng mảng %ENV để thay đổi đường dẫn hiện tại:

$ENV(PATH) = "c:\\myexec;".$ENV(PATH);

Lưu ý: Những thay đổi mà tập lệnh thực hiện đối với mảng %ENV sẽ không ảnh hưởng đến các biến môi trường ban đầu. Nói cách khác, sau khi tập lệnh kết thúc, các biến môi trường hệ thống sẽ không thay đổi.

TẬP TIN ĐẦU VÀO VÀ ĐẦU RA

Perl được thiết kế đặc biệt để trở thành một phương tiện thích hợp để đọc và ghi các tệp văn bản. Tuy nhiên, như bạn sẽ học sau này, Perl thực hiện các chức năng I/O và truy cập ngẫu nhiên trên các tệp nhị phân. Các hoạt động của tệp yêu cầu xử lý tệp, là một biến tương ứng với một tệp cụ thể. Theo mặc định, mỗi tập lệnh Perl có ba con trỏ chuẩn mà Perl tự động mở khi tập lệnh được chạy: STDIN,STDOUT, STDERR. Ba con trỏ chuẩn này tương ứng với các luồng chuẩn STDIN, STDOUT, STDERR của ngôn ngữ lập trình C. Ngoài ra, một tập lệnh Perl có thể mở thêm các con trỏ tới các tệp cụ thể khác.

MỞ TỆP VÀ CÁC DÒNG KHÁC

Để tập lệnh sử dụng tệp, tập lệnh phải gọi hàm mở. Nó trông như thế này:

Mở(FileHandle[, FileName])

Không giống như chức năng mở của thư viện thời gian chạy C, chức năng mở của Perl không bao gồm tham số chế độ trong lời gọi hàm. Perl xác định chế độ mở tệp dựa trên tên tệp. Bảng 12.3 minh họa mối quan hệ giữa chế độ mở tệp và tên tệp.

Chuyển hướng. 12.3. Quy ước truy cập và đặt tên tệp Perl


-Lưu ý: Chế độ dòng ống có thể không tồn tại trên tất cả các hệ thống.

Nếu tên tệp bị bỏ qua khi gọi mở, thì Perl giả định rằng tên tệp được chứa trong biến chuỗi $FileHandle. Khi tập lệnh đã hoàn tất việc sử dụng tệp, tập lệnh sẽ đóng tệp đó bằng hàm close, như minh họa bên dưới:

Đóng(FileHandle);

Đoạn chương trình minh họa việc sử dụng các hàm mở và đóng:

Mở(InFile, "test.dat") || chết; # mở để đọc # test.dat open(OutFile, ">test.dat") || chết; # tạo test.dat $AuxFile = ">>test.dat"; mở(Aux, $AuxFile) || chết; # mở để hoàn thành # test.dat close(InFile); đóng (OutFile); đóng (Aux);

Lưu ý rằng con trỏ tệp không có tiền tố ký tự đơn thông thường. Như bạn sẽ học sau này, các tập lệnh Perl có thể lưu trữ các tên con trỏ dưới dạng các chuỗi biến vô hướng và chuyển con trỏ tới bất kỳ hàm nào có thể xử lý chúng. Perl thực hiện chuyển đổi giá trị khi cần thiết.

Trên MS-DOS, Perl hỗ trợ một tính năng bổ sung gọi là hinmode cho phép tệp I/O chuyển đổi giữa chế độ văn bản và chế độ nhị phân. Tuy nhiên, trên hầu hết các hệ thống, sự khác biệt giữa chế độ văn bản và chế độ nhị phân là không thích hợp. Tuy nhiên, đối với hệ điều hành MS-DOS, ký tự xuống dòng là một chuỗi gồm hai ký tự (CR+LF). Bởi vì hầu hết các chương trình không muốn nhìn thấy hai ký tự ở cuối chuỗi, nên hệ thống I/O phải thực hiện chuyển đổi. Để có thể sử dụng chức năng binmode, con trỏ tương ứng có thể được mở. Hàm binmode có định dạng sau:

Binmode(FileHandle);

DÒNG ĐỌC VÀ GHI DỮ LIỆU

Cách đơn giản nhất để tập lệnh đọc một dòng từ tệp là sử dụng toán tử . Trong Perl, một con trỏ tệp được bao quanh bởi các dấu ngoặc tam giác sẽ trở thành một ký hiệu đầu vào (ký hiệu đầu vào). Ví dụ, đoạn chương trình sau minh họa việc sử dụng ký tự enter để đọc và hiển thị nội dung của tệp Test.dat.

Mở(InFile, "Test.dat") || chết; trong khi ($ dòng = ) ( print $line; # In một dòng từ tệp ) close(InFile);

Khi ký tự đầu vào đến cuối tệp, nó sẽ trả về false, kết thúc vòng lặp while trong trường hợp này. Có một ký tự đầu vào đặc biệt (trống), được biểu thị<>, có một ứng dụng rất đặc biệt nhưng hữu ích. Lần đầu tiên tập lệnh sử dụng ký tự đầu vào trống<>, nó phân tích đối số dòng lệnh. Nếu chuỗi @ARGV trống, thì ký tự đầu vào<>đọc từ STDIN. Thay vào đó, nếu @ARGV không trống, thì Perl sẽ mở tệp đầu tiên được chỉ định bởi @ARGV và đọc nội dung của tệp. Khi Perl xử lý xong một tệp, nó sẽ chuyển sang tệp tiếp theo.Sau khi tập lệnh đã đọc tất cả các tệp, ký tự<>trả về sai. Các tập lệnh Perl cũng có thể sử dụng ký tự enter để đọc toàn bộ nội dung của tệp thành một mảng, sao cho mỗi dòng của tệp trở thành một phần tử của mảng. Ví dụ: hướng dẫn sau đọc từ tệp STDIN vào mảng @lines:

@dòng= ;

Việc ghi dữ liệu vào một tập tin cũng khá đơn giản. Trên thực tế, bạn đã làm điều này mỗi khi sử dụng chức năng in. Định dạng đầy đủ của chức năng in như sau:

in danh sách;

Nếu chức năng in không nhận được một con trỏ tệp làm đối số, thì nó sẽ gửi đầu ra tới STDOUT. Đoạn chương trình sau minh họa việc sử dụng chức năng in để nối thêm dữ liệu vào tệp đầu ra:

Mở(LogFile, ">>logfile.dat") || chết; ############### ($m, $d, $y) = (giờ địa phương(giờ)) ; in nhật ký LogFile của "Thuyền trưởng", Stardate ++m$/$d/$y\n"; close(LogFile);

Lưu ý: Con trỏ tệp và danh sách đầu ra không được phân tách bằng dấu phẩy.

KHỐI DỮ LIỆU ĐỌC VÀ VIẾT

Các lập trình viên thường coi các tệp văn bản là luồng văn bảnđơn giản là vì ký tự này nối tiếp ký tự khác cho đến điểm đánh dấu cuối tệp. Nếu tập lệnh cần làm việc với một tệp được định hướng khối thay vì định hướng luồng, thì tập lệnh có thể sử dụng các hàm sysread và syswrite để xử lý các khối dữ liệu cố định. Các chức năng sysread và syswrite có các định dạng sau:

$result = sysread(FileHandle, $Var, Length[, Offset]); $result = syswrite(FileHandle, $Var, Length[, Offset]);

Nếu phần bù từ đầu tệp (Offset) được chỉ định trong lệnh gọi hàm, thì các hàm sẽ tìm kiếm vị trí mà chúng sẽ bắt đầu các hoạt động I / O. Cả hai hàm sysread và syswrite đều truyền dữ liệu bằng biến chuỗi vô hướng. Vì các hàm hoạt động trên các khối bộ nhớ cố định nên dữ liệu có thể chứa các giá trị nhị phân, bao gồm số 0 và điểm đánh dấu cuối tệp. Nếu lệnh gọi hàm chỉ định một phần bù từ đầu tệp (Offset), thì hàm tìm kiếm một vị trí trong tệp mà từ đó nó bắt đầu thực hiện các thao tác I/O. Nếu bạn đang làm việc với các khối dữ liệu, thì các tập lệnh cũng có thể sử dụng Các tính năng sau đây vào/ra:

$result = seek(FileHandle, Vị trí, Cơ sở); $result = cho biết (FileHandle); $result = eof(FileHandle);

Hàm tìm kiếm hoạt động chính xác như fseek, hàm thư viện thời gian chạy C. Tham số Vị trí chỉ định một vị trí tương đối so với gốc, do đó, vị trí này được chỉ định bởi tham số Cơ sở như sau:


- 0 Tìm kiếm từ đầu tập tin
- 1 Tìm kiếm từ vị trí hiện tại
- 2 Tìm kiếm từ cuối tập tin

Hàm tell của Perl hoạt động chính xác giống như ftell hư cấu của thư viện thời gian chạy C. Hàm này trả về vị trí hiện tại trong tệp mà từ đó thao tác đọc hoặc ghi đang được thực hiện. Cuối cùng, hàm eof, giống như hàm feof của ngôn ngữ C, trả về giá trị<истинно>hoặc<ложино>, mà tập lệnh có thể sử dụng để xác định xem đã đến cuối tệp chưa.

XỬ LÝ DỮ LIỆU NHỊ PHÂN

Mặc dù Perl chủ yếu tập trung vào xử lý văn bản, nhưng nó cũng có thể xử lý dữ liệu nhị phân. Các tập lệnh có thể di chuyển dữ liệu nhị phân theo khối bằng cách sử dụng các biến chuỗi và thực hiện các thao tác I/O byte bằng cách sử dụng các hàm sysread và syswrite. Tuy nhiên, để làm điều gì đó<полезное>với dữ liệu, tập lệnh buộc phải chuyển đổi dữ liệu thành dữ liệu của chính nó<родные>định dạng vô hướng.

LƯU TRỮ DỮ LIỆU NHIẾP

Khi tập lệnh Perl đọc một khối dữ liệu nhị phân bằng hàm sysread, nó sẽ đặt dữ liệu nhị phân đó vào một biến chuỗi vô hướng. Perl không quan tâm liệu chúng có được cung cấp giá trị hay không, liệu chúng có chứa giá trị null hay không phải ASCII hay không. Trong một chuỗi ký tự, Perl chấp nhận byte dưới dạng byte. Không giống như C, Perl không sử dụng các chuỗi kết thúc null. Nếu dữ liệu khớp với bảng mã ASCII, thì tập lệnh có thể xử lý nó giống như bất kỳ văn bản nào, nhưng nếu dữ liệu là một giá trị nhị phân, thì tập lệnh phải giải nén nó trước khi Perl có thể xử lý dữ liệu.

GIẢI PHÓNG CHUỖI DỮ LIỆU NHỊP CHUẨN VÀO CÁC BIẾN NGÔN NGỮ PERL

Để tập lệnh truy cập dữ liệu nhị phân, nó phải giải nén nó bằng cách chuyển đổi sang định dạng vô hướng. Tập lệnh Perl giải nén dữ liệu bằng chức năng giải nén, có định dạng sau:

$result = giải nén(Mẫu, Biểu thức);

Biểu thức là một biến chuỗi thông thường chứa dữ liệu nhị phân được đọc bởi hàm sysread, nhưng cũng có thể là một biểu thức cần được diễn giải dưới dạng một chuỗi. Mẫu là một chuỗi ký tự mẫu mô tả cách diễn giải các giá trị trong toán hạng Biểu thức. Đoạn mã sau minh họa việc sử dụng hàm giải nén:

($r, $g, $b) = giải nén("C3", $color);# sẽ giải nén thành 3 ký tự
- @longwords = giải nén("L*", $data); # sẽ giải nén thành một danh sách # từ dài @stuff = unpack("S2L", $bin); # sẽ giải nén thành 2 quần ngắn và dài

Mỗi ký tự mẫu có thể được theo sau bởi một số cho biết số lần sử dụng ký tự đó. Nếu có dấu hoa thị (*) thay vì số thì thao tác sẽ được thực hiện cho tất cả dữ liệu còn lại trong dòng. Nếu số không được đặt, thì nó được thực hiện một lần. Tập lệnh có thể đặt bất kỳ số lượng ký tự mẫu nào trong chuỗi Mẫu. Bảng 12.4 liệt kê các ký tự tạo nên tham số Chuỗi mẫu, cùng với mô tả về cách mỗi ký tự ảnh hưởng đến việc thực thi chức năng giải nén.

Chuyển hướng. 12.4. Biểu tượng mẫu

Biểu tượng mẫu Sự miêu tả
Một
MỘT Chuỗi ASCII không có ký tự null
b Chuỗi bit (bit ít quan trọng nhất đầu tiên)
TRONG Chuỗi bit (bit quan trọng nhất đầu tiên)
Với Ký tự có dấu một byte
VỚI Ký tự không dấu một byte
đ Giá trị dấu phẩy động, độ chính xác kép
f Giá trị dấu phẩy động, mẫu chính xác đơn
h Chuỗi giá trị thập lục phân (chữ số nhỏ nhất có nghĩa trước)
h Chuỗi giá trị thập lục phân (các chữ số có nghĩa nhất đến trước)
Tôi số nguyên đã ký
TÔI Số nguyên không dấu
tôi Số nguyên đã ký loại dài
L Tương tự nhưng không có dấu
N số nguyên ngắn
N số nguyên dài
P Con trỏ tới chuỗi
S Số nguyên ngắn đã ký
S Số nguyên không dấu ngắn
bạn giải mã chuỗi
v số nguyên ngắn
V số nguyên dài
x Bỏ qua một byte
X Bỏ qua một byte
@ Nhảy đến vị trí được chỉ định trong chuỗi

GÓI DỮ LIỆU VÀO CHUỖI NHỊ PHÂN

Để xuất dữ liệu nhị phân, tập lệnh phải đóng gói các giá trị vô hướng thành các chuỗi ký tự nhị phân. Để thực hiện việc này, hãy sử dụng chức năng gói, định dạng được hiển thị bên dưới:

$result = pack(Mẫu, Danh sách);

Đoạn chương trình sau minh họa việc sử dụng hàm pack:

$color = pack("C3", $r, $g, $b); $data = pack("L*", @longword); $bin = pack("S2L", @stuff);

Hàm gói sử dụng các ký tự đại diện giống như hàm giải nén, ngoại trừ ký tự a. A, u, x, x, @.

LÀM VIỆC VỚI DANH MỤC

Perl không chỉ cung cấp một loạt các chức năng để xử lý tệp mà còn cung cấp một số chức năng rất tiện dụng để quét các thư mục. Trong các phần sau, chúng ta sẽ xem xét chi tiết một số chức năng chính để làm việc với các thư mục.

MỞ, ĐỌC VÀ ĐÓNG DANH MỤC

Tập lệnh Perl cho phép bạn mở và đọc nội dung của tệp. Tương tự, các tập lệnh này mở các thư mục và đọc tên của các tệp mà chúng chứa. Để mở một thư mục, các tập lệnh sử dụng hàm opendir, chuyển con trỏ thư mục và đường dẫn đến thư mục đó. Để đọc danh sách các tệp có trong một thư mục, tập lệnh sử dụng chức năng readdir. Cuối cùng, chức năng closeir được sử dụng để đóng thư mục. Đoạn chương trình sau minh họa việc sử dụng hàm readdir để hiển thị danh sách các tệp trong thư mục hiện tại:

Opendir(Dir, $INC) || chết; while ($file = readdir(Dir)) ( print "$file \n" ) closedir(Dir);

Đoạn mã này sử dụng biến $INC để truy cập thư mục hiện tại. Bằng cách thay đổi $INC thành $ARGV, tập lệnh sẽ hiển thị danh sách các tệp có trong thư mục mà bạn đã chỉ định trên dòng lệnh.

Ngoài các chức năng thư mục đã thảo luận ở trên, Perl cung cấp một tập hợp các chức năng cho phép bạn định vị con trỏ hiện tại trong một danh sách thư mục:

$result = rewinddir(DirHandle); $result = Telldir(DirHandle); $result = seekdir(DirHandle, Vị trí);

ĐẦU RA ĐƯỢC ĐỊNH DẠNG

Trong chương này, bạn đã thấy một số cách để định dạng đầu ra tập lệnh bằng hàm in. Tương tự như C, Perl cũng hỗ trợ các hàm printf và sprintf, ngoài ra Perl còn hỗ trợ tạo báo cáo dạng cột sử dụng các mẫu biểu mẫu.

SỬ DỤNG CHỨC NĂNG IN

Các tập lệnh trong chương này đã sử dụng rộng rãi chức năng in. Ngoài ra, Perl cung cấp các biến đặc biệt ảnh hưởng đến cách hoạt động của hàm in. Bảng 12.5 mô tả ngắn gọn các biến đặc biệt này.

Chuyển hướng. 12.5. Các biến đặc biệt kiểm soát chức năng in

Để sử dụng các biến đặc biệt này, bạn chỉ cần gán cho chúng các giá trị mà bạn muốn. Ví dụ: đoạn mã sau sử dụng biến $ để đặt dấu phân cách giữa các mục in:

$, = "*"; @list = 1..10; in @ danh sách; # Đầu ra 1*2*3*4*5*6*7*8*9*10

Hóa ra biến $ thực sự ảnh hưởng đến tất cả các dòng, không chỉ những dòng được in. Tuy nhiên, thông thường nhất, bạn sẽ sử dụng nó để thay đổi giá trị được in bởi hàm in.

ĐẦU RA ĐƯỢC ĐỊNH DẠNG BẰNG CHỨC NĂNG PRINTF

Perl có các hàm printf và sprintf rất giống với các hàm tương ứng trong thư viện thời gian chạy C. Chúng có định dạng sau: $result = printf( Format, List); $result = sprintf(Định dạng, Danh sách);

Theo mặc định, hàm printf gửi đầu ra được định dạng tới STDIO và hàm sprintf trả về một chuỗi được định dạng. Trong cả hai trường hợp, định dạng chuỗi hầu như giống với các hàm C, ngoại trừ các hàm Perl không hỗ trợ chỉ định độ dài (*). Đoạn chương trình sau đây minh họa việc sử dụng các hàm printf và sprintf.

$precision = 2; $pi = 3,1415; printf("%.2f\n", $pi); # in 3.14 printf("%.$(precision)f", $pi); # bản in 3.14

GỌI CÁC CHƯƠNG TRÌNH BÊN NGOÀI TỪ MỘT TẬP ĐOẠN PERL

Theo một nghĩa nào đó, một sự thay thế cho các tập lệnh shell, Perl cung cấp hỗ trợ cho tương tác hệ thống, bao gồm gọi chương trình bên ngoài. Các phần sau thảo luận về một số cách để gọi các chương trình bên ngoài từ tập lệnh Perl. Tuy nhiên, hãy lưu ý rằng việc cho phép các tập lệnh thực thi các lệnh hệ thống sẽ mở ra các lỗ hổng bảo mật trong máy chủ của bạn. dán nguyên tắc chung không thực thi các lệnh bên ngoài từ tập lệnh Perl. Tuy nhiên, nếu bạn buộc phải thực thi các lệnh bên ngoài từ tập lệnh, bạn có thể sử dụng các hàm tích hợp sẵn system, exec hoặc fork cho mục đích này.

BIỂU THỨC THƯỜNG XUYÊN

Xuyên suốt chương này, bạn đã được giới thiệu các hàm mẫu để xử lý các chuỗi. Nhiều trong số chúng dựa trên khái niệm biểu thức chính quy. Như bạn có thể thấy trong các phần sau, tập lệnh Perl sử dụng rộng rãi các biểu thức chính quy để xử lý văn bản. Nếu các biểu thức thông thường là mới đối với bạn, thì đừng lo lắng. Trong một thời gian ngắn sau khi bạn đã trải qua một vài phần của chương này, các biểu thức chính quy sẽ trở nên dễ hiểu đối với bạn.

TỔNG QUAN VỀ BIỂU THỨC THƯỜNG XUYÊN

Cụm từ thông dụng là một thuật ngữ ưa thích bắt nguồn từ khoa học máy tính để chỉ một mẫu ký tự. Các tập lệnh Perl sử dụng các mẫu ký tự đơn giản để phân tích cú pháp dữ liệu đầu vào bằng cách chia nhỏ dữ liệu đó thành các phần. Thông thường, một tập lệnh có thể phân tích cú pháp đầu vào dựa trên dấu cách, dấu phẩy, tab và các dấu phân cách khác. Nhưng khi dữ liệu đầu vào ở định dạng tùy ý, thì biểu thức chính quy sẽ thực hiện công việc tốt nhất.

CÚ PHÁP BIỂU HIỆN CHÍNH XÁC

Để rút ngắn độ dài của biểu thức chính quy, Perl sử dụng các ký tự đặc biệt. Bảng 12.6 liệt kê một số ký hiệu được sử dụng bởi các tập lệnh Perl trong biểu thức chính quy x.

Chuyển hướng. 12.6. Các ký hiệu được sử dụng trong biểu thức chính quy

Biểu tượng Sự miêu tả
. Khớp với bất kỳ ký tự nào (ngoại trừ dòng mới)
(..) Nhóm một chuỗi các phần tử
+ Khớp mẫu trước đó một hoặc nhiều lần

-
Đáp ứng mô hình không hoặc một lần
* Khớp mẫu một hoặc không lần
[...] Khớp một ký tự từ tập hợp đã cho
[^...] Khớp một ký tự từ tập hợp thu được bằng cách phủ định
(...|...|...) Tương ứng với một trong các lựa chọn thay thế
^ Khớp với phần đầu của một chuỗi
$ Khớp một mẫu ở cuối chuỗi
(n,m) So khớp mẫu n đến m lần
(N) Khớp mẫu chính xác n lần
(N,) Khớp mẫu ít nhất n lần
\n\tetc. So khớp ký tự xuống dòng, ký tự tab, v.v.
\b Khớp trên một ranh giới từ
\B Khớp trong ranh giới từ
\d Tương ứng với hình
Không tương ứng với một số
\S Phù hợp với một không gian
\S Các trận đấu không phải là một khoảng trắng
\w So khớp một chữ cái hoặc số
\W Khớp với một ký tự không phải là chữ cái cũng không phải là số

Perl đặt các biểu thức chính quy (mẫu, mẫu) trong dấu gạch chéo, tức là trong dấu gạch chéo, ví dụ, ở dạng /pattern/. Đoạn chương trình sau đây minh họa các biểu thức chính quy của Perl:

# các biểu thức chính quy sau là đúng nếu: /ig/ # chuỗi chứa "ig" /(b|d|f)ig/ # chuỗi chứa "big", "dig" hoặc "fig" /+/ # chuỗi chứa một số /*/ # chuỗi chứa định danh

Nếu những biểu hiện này dường như vô nghĩa với bạn, đừng lo lắng. Trong chương này, chúng ta sẽ xem xét một số biểu thức chính quy. Bây giờ, chỉ cần nhớ rằng Perl đặt các biểu thức chính quy giữa hai dấu gạch chéo, như minh họa ở trên.

SỬ DỤNG CÁC BIỂU THỨC THƯỜNG XUYÊN ĐỂ TÌM KIẾM THEO TỪ KHÓA

Các tập lệnh Perl sử dụng các biểu thức chính quy để dễ dàng so sánh các chuỗi. Để kiểm tra xem một chuỗi có chứa một mẫu nhất định hay không, một tập lệnh có thể sử dụng các biểu thức chính quy như sau:

Nếu ($str =~ /pattern/)

Trong trường hợp này, biểu thức chính quy nhận giá trị<истинно>nếu mẫu được tìm thấy trong chuỗi ($str). Nếu chuỗi by chứa một mẫu, thì biểu thức sẽ trả về một giá trị<ложно>. Ví dụ: biểu thức sau kiểm tra xem một chuỗi có chứa văn bản Lập trình web hay không:

Nếu ($str =~ /Lập trình Web/)

Để kiểm tra sự trùng khớp chính xác, biểu thức phải liên kết phép so sánh với phần đầu và phần cuối của chuỗi. Ví dụ: biểu thức sau ước tính giá trị<истинно>, nếu và chỉ khi $str nhận một trong ba giá trị: , ) :

($str =~ /^ba(na) (2,4)$/)

Tương tự, biểu thức sau đúng khi và chỉ khi $str chứa từ và không phải là một phần của từ khác như .

($str =~ /\bthe\b/)

SỬ DỤNG BIỂU THỨC CHÍNH XÁC ĐỂ PHÂN TÍCH DỮ LIỆU ĐẦU VÀO

Khi các tập lệnh Perl của bạn trở nên phức tạp hơn, sẽ có nhiều trường hợp bạn muốn biết nhiều hơn là chỉ kiểm tra xem một mẫu có khớp với một chuỗi hay không. Ví dụ: bạn có thể muốn một tập lệnh trích xuất một giá trị cụ thể từ một chuỗi. Bằng cách sử dụng các ký tự nhóm () trong một biểu thức chính quy, tập lệnh có thể trích xuất các giá trị phù hợp từ một chuỗi và tạo thành một danh sách các giá trị đó. Ví dụ: đoạn chương trình sau sử dụng biểu thức chính quy để trích xuất tháng, ngày và năm từ danh sách:

$str = "Ngày 1 tháng 1 năm 1997," ; ($m, $d, $y) = $str =~ /\s*(\S*)\s + (\d+)\D + (\d(4))/;


- Bỏ qua bất kỳ trước tính cách đặc biệt;
- viết tất cả các ký tự không đặc biệt cho biến $m
- (biến để biểu thị tháng);
- bỏ qua ký tự đặc biệt;
- đặt tất cả các chữ số vào biến $d (biến để ghi ngày);
- bỏ qua tất cả các ký tự không phải là số;
- viết bốn chữ số vào biến $y (biến cho năm).

Perl cũng hỗ trợ một hình thức so khớp mẫu khác, sử dụng toán tử (=~), toán tử này thêm một phủ định cho kết quả: (!~). Toán tử này tương đương với biểu thức!($str=~/pattern/).

BIỂU THỨC THƯỜNG XUYÊN ĐỂ TÌM KIẾM VÀ THAY THẾ CHUỖI

Cho đến giờ, bạn đã sử dụng các toán tử so khớp mẫu. Hóa ra Perl hỗ trợ hai biểu thức chính quy khác sửa đổi biến chuỗi đang được kiểm tra. Trong câu lệnh sau, Perl thay thế một phần của chuỗi khớp với mẫu bằng chuỗi đã cho:

$str =~ s/mẫu/thay thế/;

Ví dụ: câu lệnh sau sẽ thay thế từ TRÊN :

$str =~ s/\bcolor\b/color/;

Một sửa đổi nhỏ cho phép bạn thay thế tất cả các từ TRÊN :

$str =~ s/\bcolor\b/color/g;

Trong trường hợp này, g ở cuối biểu thức yêu cầu Perl sử dụng thay thế toàn cục.

Sử dụng hậu tố i, bạn có thể chỉ định rằng tìm kiếm phân biệt chữ hoa chữ thường. Trái ngược với phép so khớp mẫu đơn giản, biểu thức sau đây cũng thực hiện phép thay thế:

$str =~ tr/SearchList/ReplacementList/;

Ví dụ: thay thế tất cả các ký tự chữ thường bằng các ký tự giống nhau chữ hoa có thể được thực hiện như thế này:

$str =~tr/a-z/A-Z/; # đổi chữ thường thành chữ thường

Hãy xem xét ví dụ sau đây cho chính mình:

$letters = "abcde"; in "$letters\n" # In abcde $letters =~ tr/a-z/A-Z/; in "$letters\n" # In ABCDE

BẢN TÓM TẮT

Chương này giới thiệu về lập trình Perl. Sử dụng các khái niệm được thảo luận ở đây, bạn có thể viết các tập lệnh CGI phức tạp trong Perl. Chương tiếp theo sẽ giúp bạn đạt được các kỹ năng tạo tập lệnh Perl CGI mà bạn có thể chạy trên máy chủ của riêng mình. Trước khi tiếp tục, hãy đảm bảo bạn hiểu các khái niệm chính sau:

Perl là một ngôn ngữ lập trình được giải thích được các lập trình viên sử dụng để viết các tập lệnh cho Web và Internet.

Các cấu trúc ngôn ngữ của Perl tương tự như trong C ở nhiều khía cạnh, nhưng Perl cung cấp nhiều tính năng bổ sung, đặc biệt là để xử lý các chuỗi và tệp khó tìm thấy trong C.

Perl là ngôn ngữ chính để viết các chương trình CGI cho Web và Internet, chủ yếu là do tính linh hoạt, phong cách nhỏ gọn và tính bảo mật cao của nó.

TRANG WEB PERL HÀNG ĐẦU

Các trang Web sau đây sẽ giúp bạn tìm thông tin về các chi tiết mà bạn quan tâm về ngôn ngữ Pcrl, tập lệnh của nó và thông tin cụ thể về các tài nguyên và thư viện ngôn ngữ Perl 5. Sử dụng các trang Web này làm điểm bắt đầu cho việc tìm kiếm của bạn.

BẢN TÓM TẮT

Trong chương này, bạn đã học cách sử dụng Perl để viết các tập lệnh CGI khá phức tạp. Sử dụng các kỹ thuật đã học, bạn có thể cung cấp các dịch vụ lập trình chuyên nghiệp cho khách hàng của mình, những người muốn doanh nghiệp của họ xuất hiện trên Web. Chương 14 giới thiệu với bạn về ngôn ngữ Java. Như bạn sẽ thấy, ngôn ngữ Java rất phù hợp để tạo nút web chứa hình ảnh động và đa phương tiện. Ngoài ra, chương 14 giới thiệu một ngôn ngữ khác để viết tập lệnh JavaScript. Tuy nhiên, trước khi chuyển sang Chương 14, hãy kiểm tra xem bạn có hiểu các khái niệm chính sau đây không:
- Perl là một ngôn ngữ lập trình linh hoạt và linh hoạt mà bạn có thể phát triển các tập lệnh CGI cho Web, cũng như các chương trình truyền thống để sử dụng hàng ngày.

  • Perl rất phù hợp để xử lý văn bản, truy cập cơ sở dữ liệu, nó là ngôn ngữ di động và nó cung cấp bảo mật cho mạng. Tất cả những đặc điểm này đều quan trọng đối với lập trình Web.
  • Các tập lệnh Perl sử dụng rộng rãi các biểu thức chính quy để xử lý văn bản.
  • Hầu hết các tập lệnh trên Web hiện được viết bằng Perl. Tuy nhiên, các ngôn ngữ như JavaScript và VBScript có thể thách thức sự độc quyền của Perl.