Perl - Hướng dẫn nhanh

Perl là một ngôn ngữ lập trình có mục đích chung ban đầu được phát triển để thao tác văn bản và hiện được sử dụng cho nhiều tác vụ bao gồm quản trị hệ thống, phát triển web, lập trình mạng, phát triển GUI, v.v.

Perl là gì?

  • Perl là một ngôn ngữ lập trình ổn định, đa nền tảng.

  • Mặc dù Perl không chính thức là một từ viết tắt nhưng ít người sử dụng nó như Practical Extraction and Report Language.

  • Nó được sử dụng cho các dự án quan trọng trong khu vực công và tư nhân.

  • Perl là một phần mềm Nguồn mở , được cấp phép theo Giấy phép Nghệ thuật , hoặc Giấy phép Công cộng GNU (GPL) .

  • Perl được tạo ra bởi Larry Wall.

  • Perl 1.0 được phát hành cho các nguồn alt.comp.sources của usenet vào năm 1987.

  • Tại thời điểm viết hướng dẫn này, phiên bản mới nhất của perl là 5.16.2.

  • Perl được liệt kê trong Từ điển tiếng Anh Oxford .

Tạp chí PC đã công bố Perl là người lọt vào vòng chung kết cho Giải thưởng Xuất sắc về Kỹ thuật năm 1998 trong hạng mục Công cụ Phát triển.

Tính năng Perl

  • Perl lấy các tính năng tốt nhất từ ​​các ngôn ngữ khác, chẳng hạn như C, awk, sed, sh và BASIC, trong số những ngôn ngữ khác.

  • Giao diện tích hợp cơ sở dữ liệu Perls DBI hỗ trợ cơ sở dữ liệu của bên thứ ba bao gồm Oracle, Sybase, Postgres, MySQL và các cơ sở khác.

  • Perl hoạt động với HTML, XML và các ngôn ngữ đánh dấu khác.

  • Perl hỗ trợ Unicode.

  • Perl tuân thủ Y2K.

  • Perl hỗ trợ cả lập trình thủ tục và hướng đối tượng.

  • Perl giao diện với các thư viện C / C ++ bên ngoài thông qua XS hoặc SWIG.

  • Perl có thể mở rộng. Có hơn 20.000 mô-đun của bên thứ ba có sẵn từ Mạng lưu trữ Perl toàn diện ( CPAN ).

  • Trình thông dịch Perl có thể được nhúng vào các hệ thống khác.

Perl và Web

  • Perl từng là ngôn ngữ lập trình web phổ biến nhất do khả năng thao tác văn bản và chu kỳ phát triển nhanh chóng.

  • Perl được biết đến rộng rãi là " băng keo của Internet ".

  • Perl có thể xử lý dữ liệu Web được mã hóa, bao gồm cả các giao dịch thương mại điện tử.

  • Perl có thể được nhúng vào máy chủ web để tăng tốc độ xử lý lên đến 2000%.

  • Perl's mod_perl cho phép máy chủ web Apache nhúng một trình thông dịch Perl.

  • Gói DBI của Perl giúp tích hợp cơ sở dữ liệu web dễ dàng.

Perl được thông dịch

Perl là một ngôn ngữ thông dịch, có nghĩa là mã của bạn có thể được chạy nguyên trạng, không có giai đoạn biên dịch tạo ra một chương trình thực thi không di động.

Các trình biên dịch truyền thống chuyển đổi chương trình sang ngôn ngữ máy. Khi bạn chạy một chương trình Perl, đầu tiên nó được biên dịch thành một mã byte, sau đó được chuyển đổi (khi chương trình chạy) thành các lệnh máy. Vì vậy, nó không hoàn toàn giống với shell, hay Tcl, làstrictly được diễn giải mà không có đại diện trung gian.

Nó cũng không giống như hầu hết các phiên bản C hoặc C ++, được biên dịch trực tiếp sang định dạng phụ thuộc vào máy. Nó nằm ở đâu đó, cùng với các tệp Pythonawk và Emacs .elc.

Trước khi bắt đầu viết các chương trình Perl, hãy hiểu cách thiết lập môi trường Perl của chúng ta. Perl có sẵn trên nhiều nền tảng -

  • Unix (Solaris, Linux, FreeBSD, AIX, HP / UX, SunOS, IRIX, v.v.)
  • Giành chiến thắng 9x / NT / 2000 /
  • WinCE
  • Macintosh (PPC, 68K)
  • Solaris (x86, SPARC)
  • OpenVMS
  • Alpha (7.2 trở lên)
  • Symbian
  • Debian GNU / kFreeBSD
  • MirOS BSD
  • Và nhiều thứ khác nữa...

Điều này có nhiều khả năng là hệ thống của bạn sẽ được cài đặt perl trên đó. Chỉ cần thử đưa ra lệnh sau tại dấu nhắc $ -

$perl -v

Nếu bạn đã cài đặt perl trên máy của mình, thì bạn sẽ nhận được một thông báo như sau:

This is perl 5, version 16, subversion 2 (v5.16.2) built for i686-linux

Copyright 1987-2012, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.

Nếu bạn chưa cài đặt perl, hãy chuyển sang phần tiếp theo.

Bắt đầu cài đặt Perl

Mã nguồn, mã nhị phân, tài liệu, tin tức, v.v. cập nhật và mới nhất hiện có tại trang web chính thức của Perl.

Perl Official Website - https://www.perl.org/

Bạn có thể tải xuống tài liệu Perl từ trang web sau.

Perl Documentation Website - https://perldoc.perl.org

Cài đặt Perl

Phân phối Perl có sẵn cho nhiều nền tảng khác nhau. Bạn chỉ cần tải xuống mã nhị phân áp dụng cho nền tảng của mình và cài đặt Perl.

Nếu mã nhị phân cho nền tảng của bạn không có sẵn, bạn cần trình biên dịch C để biên dịch mã nguồn theo cách thủ công. Việc biên dịch mã nguồn mang lại sự linh hoạt hơn trong việc lựa chọn các tính năng mà bạn yêu cầu trong cài đặt của mình.

Dưới đây là tổng quan nhanh về cài đặt Perl trên các nền tảng khác nhau.

Cài đặt Unix và Linux

Dưới đây là các bước đơn giản để cài đặt Perl trên máy Unix / Linux.

  • Mở trình duyệt Web và truy cập https://www.perl.org/get.html.

  • Nhấp vào liên kết để tải xuống mã nguồn nén có sẵn cho Unix / Linux.

  • Tải xuống perl-5.x.y.tar.gz và đưa ra các lệnh sau tại $ prompt.

$tar -xzf perl-5.x.y.tar.gz
$cd perl-5.x.y $./Configure -de
$make $make test
$make install

NOTE - Đây $ là lời nhắc Unix nơi bạn nhập lệnh của mình, vì vậy hãy đảm bảo rằng bạn không nhập $ khi nhập các lệnh đã đề cập ở trên.

Thao tác này sẽ cài đặt Perl ở vị trí chuẩn / usr / local / bin và các thư viện của nó được cài đặt trong / usr / local / lib / perlXX , trong đó XX là phiên bản Perl mà bạn đang sử dụng.

Sẽ mất một lúc để biên dịch mã nguồn sau khi phát hành makechỉ huy. Sau khi cài đặt xong, bạn có thể phát hànhperl -vlệnh tại dấu nhắc $ để kiểm tra cài đặt perl. Nếu mọi thứ đều tốt, thì nó sẽ hiển thị thông báo như chúng tôi đã hiển thị ở trên.

Cài đặt Windows

Dưới đây là các bước để cài đặt Perl trên máy Windows.

  • Theo liên kết để cài đặt Strawberry Perl trên Windows http://strawberryperl.com

  • Tải xuống phiên bản cài đặt 32bit hoặc 64bit.

  • Chạy tệp đã tải xuống bằng cách nhấp đúp vào tệp đó trong Windows Explorer. Thao tác này sẽ hiển thị trình hướng dẫn cài đặt Perl, rất dễ sử dụng. Chỉ cần chấp nhận cài đặt mặc định, đợi cho đến khi cài đặt xong và bạn đã sẵn sàng để sử dụng!

Cài đặt Macintosh

Để xây dựng phiên bản Perl của riêng mình, bạn sẽ cần 'make', đây là một phần của công cụ dành cho nhà phát triển Táo khuyết thường được cung cấp cùng với DVD cài đặt Mac OS. Bạn không cần phiên bản Xcode mới nhất (hiện đã bị tính phí) để cài đặt make.

Dưới đây là các bước đơn giản để cài đặt Perl trên máy Mac OS X.

  • Mở trình duyệt Web và truy cập https://www.perl.org/get.html.

  • Nhấp vào liên kết để tải xuống mã nguồn nén có sẵn cho Mac OS X.

  • Tải xuống perl-5.x.y.tar.gz và đưa ra các lệnh sau tại $ prompt.

$tar -xzf perl-5.x.y.tar.gz
$cd perl-5.x.y $./Configure -de
$make $make test
$make install

Thao tác này sẽ cài đặt Perl ở vị trí chuẩn / usr / local / bin và các thư viện của nó được cài đặt trong / usr / local / lib / perlXX , trong đó XX là phiên bản Perl mà bạn đang sử dụng.

Chạy Perl

Sau đây là các cách khác nhau để bắt đầu Perl.

Phiên dịch tương tác

Bạn có thể nhập perlvà bắt đầu viết mã ngay trong trình thông dịch tương tác bằng cách bắt đầu nó từ dòng lệnh. Bạn có thể thực hiện việc này từ Unix, DOS hoặc bất kỳ hệ thống nào khác, hệ thống này cung cấp cho bạn trình thông dịch dòng lệnh hoặc cửa sổ trình bao.

$perl  -e <perl code>           # Unix/Linux

or 

C:>perl -e <perl code>          # Windows/DOS

Đây là danh sách tất cả các tùy chọn dòng lệnh có sẵn:

Sr.No. Tùy chọn & Mô tả
1

-d[:debugger]

Chạy chương trình trong trình gỡ lỗi

2

-Idirectory

Chỉ định thư mục bao gồm @ INC / #

3

-T

Cho phép kiểm tra nhiễm độc

4

-t

Bật cảnh báo nhiễm độc

5

-U

Cho phép các hoạt động không an toàn

6

-w

Cho phép nhiều cảnh báo hữu ích

7

-W

Bật tất cả cảnh báo

số 8

-X

Tắt tất cả cảnh báo

9

-e program

Chạy tập lệnh Perl được gửi dưới dạng chương trình

10

file

Chạy tập lệnh Perl từ một tệp nhất định

Tập lệnh từ dòng lệnh

Tập lệnh Perl là một tệp văn bản, giữ mã perl trong đó và nó có thể được thực thi tại dòng lệnh bằng cách gọi trình thông dịch trên ứng dụng của bạn, như sau:

$perl  script.pl          # Unix/Linux

or 

C:>perl script.pl         # Windows/DOS

Môi trường phát triển tích hợp

Bạn cũng có thể chạy Perl từ môi trường giao diện người dùng đồ họa (GUI). Tất cả những gì bạn cần là một ứng dụng GUI trên hệ thống của bạn có hỗ trợ Perl. Bạn có thể tải xuống Padre, Perl IDE . Bạn cũng có thể sử dụng Eclipse Plugin EPIC - Perl Editor và IDE cho Eclipse nếu bạn đã quen thuộc với Eclipse.

Trước khi chuyển sang chương tiếp theo, hãy đảm bảo rằng môi trường của bạn được thiết lập đúng cách và hoạt động hoàn toàn tốt. Nếu bạn không thể thiết lập môi trường đúng cách thì bạn có thể nhờ người quản trị hệ thống trợ giúp.

Tất cả các ví dụ được đưa ra trong các chương tiếp theo đã được thực thi với phiên bản v5.16.2 có sẵn trên phiên bản CentOS của Linux.

Perl vay mượn cú pháp và khái niệm từ nhiều ngôn ngữ: awk, sed, C, Bourne Shell, Smalltalk, Lisp và thậm chí cả tiếng Anh. Tuy nhiên, có một số khác biệt nhất định giữa các ngôn ngữ. Chương này được chỉ định để giúp bạn nhanh chóng bắt kịp cú pháp được mong đợi trong Perl.

Một chương trình Perl bao gồm một chuỗi các khai báo và câu lệnh, chạy từ trên xuống dưới. Vòng lặp, chương trình con và các cấu trúc điều khiển khác cho phép bạn nhảy xung quanh trong mã. Mọi câu lệnh đơn giản phải kết thúc bằng dấu chấm phẩy (;).

Perl là một ngôn ngữ dạng tự do: bạn có thể định dạng và thụt lề cho nó theo cách bạn muốn. Khoảng trắng chủ yếu dùng để phân tách các mã thông báo, không giống như các ngôn ngữ như Python, nơi nó là một phần quan trọng của cú pháp hoặc Fortran nơi nó là phi vật chất.

Chương trình Perl đầu tiên

Lập trình chế độ tương tác

Bạn có thể sử dụng trình thông dịch Perl với -etại dòng lệnh, cho phép bạn thực thi các câu lệnh Perl từ dòng lệnh. Hãy thử một cái gì đó tại $ prompt như sau:

$perl -e 'print "Hello World\n"'

Việc thực thi này sẽ tạo ra kết quả sau:

Hello, world

Lập trình chế độ tập lệnh

Giả sử bạn đã ở trên $ prompt, hãy mở tệp văn bản hello.pl bằng trình chỉnh sửa vi hoặc vim và đặt các dòng sau vào tệp của bạn.

#!/usr/bin/perl

# This will print "Hello, World"
print "Hello, world\n";

Đây /usr/bin/perlthực tế là nhị phân thông dịch perl. Trước khi bạn thực thi tập lệnh của mình, hãy đảm bảo thay đổi chế độ của tệp tập lệnh và cấp quyền thực thi, nói chung cài đặt 0755 hoạt động hoàn hảo và cuối cùng bạn thực thi tập lệnh trên như sau:

$chmod 0755 hello.pl $./hello.pl

Việc thực thi này sẽ tạo ra kết quả sau:

Hello, world

Bạn có thể sử dụng dấu ngoặc đơn cho các đối số của hàm hoặc bỏ qua chúng theo sở thích cá nhân của bạn. Họ chỉ được yêu cầu thỉnh thoảng làm rõ các vấn đề được ưu tiên. Hai câu lệnh sau đây tạo ra cùng một kết quả.

print("Hello, world\n");
print "Hello, world\n";

Phần mở rộng tệp Perl

Một tập lệnh Perl có thể được tạo bên trong bất kỳ chương trình soạn thảo văn bản đơn giản thông thường nào. Có một số chương trình có sẵn cho mọi loại nền tảng. Có rất nhiều chương trình được chỉ định cho các lập trình viên có sẵn để tải xuống trên web.

Theo quy ước Perl, tệp Perl phải được lưu với phần mở rộng tệp .pl hoặc .PL để được công nhận là tập lệnh Perl đang hoạt động. Tên tệp có thể chứa số, ký hiệu và chữ cái nhưng không được chứa khoảng trắng. Sử dụng dấu gạch dưới (_) ở các vị trí của khoảng trắng.

Nhận xét trong Perl

Nhận xét trong bất kỳ ngôn ngữ lập trình nào là bạn của các nhà phát triển. Các chú thích có thể được sử dụng để làm cho chương trình thân thiện với người dùng và chúng chỉ được trình thông dịch bỏ qua mà không ảnh hưởng đến chức năng mã. Ví dụ, trong chương trình trên, một dòng bắt đầu bằng băm# là một bình luận.

Đơn giản chỉ cần nói nhận xét trong Perl bắt đầu bằng ký hiệu băm và chạy đến cuối dòng -

# This is a comment in perl

Các dòng bắt đầu bằng = được hiểu là phần bắt đầu của một phần của tài liệu nhúng (pod), và tất cả các dòng tiếp theo cho đến khi dấu = cắt tiếp theo bị trình biên dịch bỏ qua. Sau đây là ví dụ -

#!/usr/bin/perl

# This is a single line comment
print "Hello, world\n";

=begin comment
This is all part of multiline comment.
You can use as many lines as you like
These comments will be ignored by the 
compiler until the next =cut is encountered.
=cut

Điều này sẽ tạo ra kết quả sau:

Hello, world

Khoảng trắng trong Perl

Một chương trình Perl không quan tâm đến khoảng trắng. Chương trình sau hoạt động hoàn toàn tốt -

#!/usr/bin/perl

print       "Hello, world\n";

Nhưng nếu khoảng trắng nằm bên trong các chuỗi được trích dẫn, thì chúng sẽ được in như hiện tại. Ví dụ -

#!/usr/bin/perl

# This would print with a line break in the middle
print "Hello
          world\n";

Điều này sẽ tạo ra kết quả sau:

Hello
          world

Tất cả các loại khoảng trắng như dấu cách, tab, dòng mới, v.v. đều tương đương với trình thông dịch khi chúng được sử dụng bên ngoài dấu ngoặc kép. Một dòng chỉ chứa khoảng trắng, có thể có chú thích, được gọi là dòng trống và Perl hoàn toàn bỏ qua nó.

Báo giá đơn và báo giá kép trong Perl

Bạn có thể sử dụng dấu ngoặc kép hoặc dấu nháy đơn xung quanh các chuỗi ký tự như sau:

#!/usr/bin/perl

print "Hello, world\n";
print 'Hello, world\n';

Điều này sẽ tạo ra kết quả sau:

Hello, world
Hello, world\n$

Có một sự khác biệt quan trọng trong dấu ngoặc kép và đơn. Chỉ dấu ngoặc képinterpolatebiến và các ký tự đặc biệt, chẳng hạn như dòng mới \ n, trong khi một dấu ngoặc kép không nội suy bất kỳ biến hoặc ký tự đặc biệt nào. Kiểm tra ví dụ dưới đây, nơi chúng tôi đang sử dụng $ a làm biến để lưu trữ một giá trị và sau đó in giá trị đó -

#!/usr/bin/perl

$a = 10; print "Value of a = $a\n";
print 'Value of a = $a\n';

Điều này sẽ tạo ra kết quả sau:

Value of a = 10
Value of a = $a\n$

Tài liệu "Đây"

Bạn có thể lưu trữ hoặc in văn bản nhiều dòng một cách thoải mái. Thậm chí bạn có thể sử dụng các biến bên trong tài liệu "here". Dưới đây là một cú pháp đơn giản, hãy kiểm tra cẩn thận để không có khoảng trắng giữa dấu << và mã định danh.

Giá trị nhận dạng có thể là một từ trống hoặc một số văn bản được trích dẫn như chúng tôi đã sử dụng EOF bên dưới. Nếu mã định danh được trích dẫn, loại trích dẫn bạn sử dụng sẽ xác định cách xử lý văn bản bên trong biểu tượng tại đây, giống như trong trích dẫn thông thường. Một mã định danh không được trích dẫn hoạt động giống như dấu ngoặc kép.

#!/usr/bin/perl

$a = 10;
$var = <<"EOF"; This is the syntax for here document and it will continue until it encounters a EOF in the first line. This is case of double quote so variable value will be interpolated. For example value of a = $a
EOF
print "$var\n"; $var = <<'EOF';
This is case of single quote so variable value will be 
interpolated. For example value of a = $a EOF print "$var\n";

Điều này sẽ tạo ra kết quả sau:

This is the syntax for here document and it will continue
until it encounters a EOF in the first line.
This is case of double quote so variable value will be
interpolated. For example value of a = 10

This is case of single quote so variable value will be
interpolated. For example value of a = $a

Nhân vật đang chạy trốn

Perl sử dụng ký tự gạch chéo ngược (\) để thoát khỏi bất kỳ loại ký tự nào có thể ảnh hưởng đến mã của chúng tôi. Hãy lấy một ví dụ mà chúng ta muốn in dấu ngoặc kép và dấu $ -

#!/usr/bin/perl

$result = "This is \"number\""; print "$result\n";
print "\$result\n";

Điều này sẽ tạo ra kết quả sau:

This is "number"
$result

Định danh Perl

Định danh Perl là tên được sử dụng để xác định một biến, hàm, lớp, mô-đun hoặc đối tượng khác. Tên biến Perl bắt đầu bằng $, @ hoặc% theo sau là không hoặc nhiều chữ cái, dấu gạch dưới và chữ số (0 đến 9).

Perl không cho phép các ký tự dấu câu như @, $ và% trong số nhận dạng. Perl là mộtcase sensitivengôn ngữ lập trình. Như vậy$Manpower$manpower là hai định danh khác nhau trong Perl.

Perl là một ngôn ngữ được gõ lỏng lẻo và không cần chỉ định kiểu cho dữ liệu của bạn khi sử dụng trong chương trình của bạn. Trình thông dịch Perl sẽ chọn kiểu dựa trên ngữ cảnh của chính dữ liệu.

Perl có ba kiểu dữ liệu cơ bản: vô hướng, mảng vô hướng và băm vô hướng, còn được gọi là mảng kết hợp. Dưới đây là một chút chi tiết về các kiểu dữ liệu này.

Sr.No. Loại & Mô tả
1

Scalar

Vô hướng là các biến đơn giản. Chúng được đặt trước bởi một ký hiệu đô la ($). Một đại lượng vô hướng là một số, một chuỗi hoặc một tham chiếu. Một tham chiếu thực sự là một địa chỉ của một biến, chúng ta sẽ thấy trong các chương sắp tới.

2

Arrays

Mảng là danh sách có thứ tự các đại lượng vô hướng mà bạn truy cập với chỉ mục số, bắt đầu bằng 0. Chúng được đặt trước dấu "at" (@).

3

Hashes

Hàm băm là các tập hợp cặp khóa / giá trị không có thứ tự mà bạn truy cập bằng cách sử dụng các khóa dưới dạng chỉ số con. Chúng được bắt đầu bằng dấu phần trăm (%).

Chữ số

Perl lưu trữ tất cả các số bên trong dưới dạng số nguyên có dấu hoặc giá trị dấu phẩy động có độ chính xác kép. Các ký tự số được chỉ định trong bất kỳ định dạng dấu phẩy động hoặc số nguyên nào sau đây:

Kiểu Giá trị
Số nguyên 1234
Số nguyên âm -100
Dấu chấm động 2000
Ký hiệu khoa học 16,12E14
Hệ thập lục phân 0xffff
Bát phân 0577

Chuỗi chữ

Chuỗi là chuỗi các ký tự. Chúng thường là các giá trị chữ và số được phân tách bằng dấu ngoặc kép (') hoặc kép ("). Chúng hoạt động giống như dấu ngoặc kép UNIX trong đó bạn có thể sử dụng các chuỗi được trích dẫn đơn và chuỗi được trích dẫn kép.

Các ký tự trong chuỗi được trích dẫn kép cho phép nội suy biến và các chuỗi được trích dẫn đơn thì không. Có một số ký tự nhất định khi chúng được tiếp tục bằng dấu gạch chéo ngược, có ý nghĩa đặc biệt và chúng được sử dụng để biểu thị như dòng mới (\ n) hoặc tab (\ t).

Bạn có thể nhúng dòng mới hoặc bất kỳ chuỗi Escape nào sau đây trực tiếp vào chuỗi được trích dẫn kép của mình -

Trình tự thoát Ý nghĩa
\\ Dấu gạch chéo ngược
\ ' Trích dẫn duy nhất
\ " Dấu ngoặc kép
\ a Cảnh báo hoặc chuông
\ b Backspace
\ f Thức ăn dạng
\ n Dòng mới
\ r Vận chuyển trở lại
\ t Tab ngang
\ v Tab dọc
\ 0nn Tạo các số có định dạng bát phân
\ xnn Tạo các số có định dạng Hexideciamal
\ cX Các ký tự điều khiển, x có thể là bất kỳ ký tự nào
\ u Buộc ký tự tiếp theo thành chữ hoa
\ l Buộc ký tự tiếp theo thành chữ thường
\ U Buộc tất cả các ký tự sau thành chữ hoa
\ L Buộc tất cả các ký tự sau thành chữ thường
\ Q Dấu gạch chéo ngược tất cả các ký tự không phải chữ và số sau
\ E End \ U, \ L hoặc \ Q

Thí dụ

Chúng ta hãy xem lại cách các chuỗi hoạt động với dấu ngoặc kép và dấu ngoặc kép. Ở đây chúng tôi sẽ sử dụng các thoát chuỗi được đề cập trong bảng trên và sẽ sử dụng biến vô hướng để gán giá trị chuỗi.

#!/usr/bin/perl

# This is case of interpolation.
$str = "Welcome to \ntutorialspoint.com!";
print "$str\n"; # This is case of non-interpolation. $str = 'Welcome to \ntutorialspoint.com!';
print "$str\n"; # Only W will become upper case. $str = "\uwelcome to tutorialspoint.com!";
print "$str\n"; # Whole line will become capital. $str = "\UWelcome to tutorialspoint.com!";
print "$str\n"; # A portion of line will become capital. $str = "Welcome to \Ututorialspoint\E.com!"; 
print "$str\n"; # Backsalash non alpha-numeric including spaces. $str = "\QWelcome to tutorialspoint's family";
print "$str\n";

Điều này sẽ tạo ra kết quả sau:

Welcome to
tutorialspoint.com!
Welcome to \ntutorialspoint.com!
Welcome to tutorialspoint.com!
WELCOME TO TUTORIALSPOINT.COM!
Welcome to TUTORIALSPOINT.com!
Welcome\ to\ tutorialspoint\'s\ family

Các biến là vị trí bộ nhớ dành riêng để lưu trữ các giá trị. Điều này có nghĩa là khi bạn tạo một biến, bạn dành một số không gian trong bộ nhớ.

Dựa trên kiểu dữ liệu của một biến, trình thông dịch phân bổ bộ nhớ và quyết định những gì có thể được lưu trữ trong bộ nhớ dành riêng. Do đó, bằng cách gán các kiểu dữ liệu khác nhau cho các biến, bạn có thể lưu trữ số nguyên, số thập phân hoặc chuỗi trong các biến này.

Chúng tôi đã biết rằng Perl có ba kiểu dữ liệu cơ bản sau:

  • Scalars
  • Arrays
  • Hashes

Theo đó, chúng ta sẽ sử dụng ba loại biến trong Perl. Ascalarbiến sẽ đứng trước một dấu đô la ($) và nó có thể lưu trữ một số, một chuỗi hoặc một tham chiếu. Anarraybiến sẽ đứng trước dấu @ và nó sẽ lưu trữ danh sách các đại lượng vô hướng có thứ tự. Cuối cùng,Hash biến sẽ đứng trước dấu% và sẽ được sử dụng để lưu trữ các bộ cặp khóa / giá trị.

Perl duy trì mọi loại biến trong một không gian tên riêng biệt. Vì vậy, bạn có thể, mà không sợ xung đột, sử dụng cùng một tên cho một biến vô hướng, một mảng hoặc một hàm băm. Điều này có nghĩa là $ foo và @foo là hai biến khác nhau.

Tạo biến

Các biến Perl không cần phải khai báo rõ ràng để dành không gian bộ nhớ. Việc khai báo xảy ra tự động khi bạn gán giá trị cho một biến. Dấu bằng (=) dùng để gán giá trị cho các biến.

Lưu ý rằng điều này là bắt buộc để khai báo một biến trước khi chúng tôi sử dụng nếu chúng tôi sử dụng use strict tuyên bố trong chương trình của chúng tôi.

Toán hạng ở bên trái của toán tử = là tên của biến và toán hạng ở bên phải của toán tử = là giá trị được lưu trữ trong biến. Ví dụ -

$age = 25;             # An integer assignment
$name = "John Paul"; # A string $salary = 1445.50;     # A floating point

Ở đây 25, "John Paul" và 1445,50 lần lượt là các giá trị được gán cho các biến $ age , $ name$ lương . Trong thời gian ngắn, chúng ta sẽ thấy cách chúng ta có thể gán giá trị cho mảng và hàm băm.

Biến vô hướng

Vô hướng là một đơn vị dữ liệu duy nhất. Dữ liệu đó có thể là một số nguyên, dấu phẩy động, một ký tự, một chuỗi, một đoạn văn hoặc toàn bộ trang web. Nói đơn giản nó có thể là bất cứ thứ gì, nhưng chỉ là một thứ duy nhất.

Đây là một ví dụ đơn giản về việc sử dụng các biến vô hướng:

#!/usr/bin/perl

$age = 25;             # An integer assignment
$name = "John Paul"; # A string $salary = 1445.50;     # A floating point

print "Age = $age\n"; print "Name = $name\n";
print "Salary = $salary\n";

Điều này sẽ tạo ra kết quả sau:

Age = 25
Name = John Paul
Salary = 1445.5

Biến mảng

Mảng là một biến lưu trữ một danh sách có thứ tự các giá trị vô hướng. Các biến mảng được đặt trước dấu "at" (@). Để tham chiếu đến một phần tử duy nhất của mảng, bạn sẽ sử dụng ký hiệu đô la ($) với tên biến theo sau là chỉ số của phần tử trong dấu ngoặc vuông.

Đây là một ví dụ đơn giản về việc sử dụng các biến mảng:

#!/usr/bin/perl

@ages = (25, 30, 40);             
@names = ("John Paul", "Lisa", "Kumar");

print "\$ages[0] = $ages[0]\n";
print "\$ages[1] = $ages[1]\n";
print "\$ages[2] = $ages[2]\n";
print "\$names[0] = $names[0]\n";
print "\$names[1] = $names[1]\n";
print "\$names[2] = $names[2]\n";

Ở đây, chúng tôi đã sử dụng dấu thoát (\) trước dấu $ chỉ để in nó. Perl khác sẽ hiểu nó như một biến và sẽ in ra giá trị của nó. Khi được thực thi, điều này sẽ tạo ra kết quả sau:

$ages[0] = 25
$ages[1] = 30 $ages[2] = 40
$names[0] = John Paul $names[1] = Lisa
$names[2] = Kumar

Biến băm

Hàm băm là một tập hợp của key/valuecặp. Các biến băm được đặt trước bằng dấu phần trăm (%). Để tham chiếu đến một phần tử duy nhất của hàm băm, bạn sẽ sử dụng tên biến băm theo sau là "khóa" được liên kết với giá trị trong dấu ngoặc nhọn.

Đây là một ví dụ đơn giản về việc sử dụng biến băm -

#!/usr/bin/perl

%data = ('John Paul', 45, 'Lisa', 30, 'Kumar', 40);

print "\$data{'John Paul'} = $data{'John Paul'}\n"; print "\$data{'Lisa'} = $data{'Lisa'}\n"; print "\$data{'Kumar'} = $data{'Kumar'}\n";

Điều này sẽ tạo ra kết quả sau:

$data{'John Paul'} = 45
$data{'Lisa'} = 30 $data{'Kumar'} = 40

Bối cảnh biến

Perl xử lý cùng một biến khác nhau dựa trên Ngữ cảnh, tức là, tình huống mà một biến đang được sử dụng. Hãy kiểm tra ví dụ sau:

#!/usr/bin/perl

@names = ('John Paul', 'Lisa', 'Kumar');

@copy = @names;
$size = @names; print "Given names are : @copy\n"; print "Number of names are : $size\n";

Điều này sẽ tạo ra kết quả sau:

Given names are : John Paul Lisa Kumar
Number of names are : 3

Ở đây @names là một mảng, đã được sử dụng trong hai ngữ cảnh khác nhau. Đầu tiên, chúng tôi sao chép nó vào bất kỳ mảng nào khác, tức là danh sách, vì vậy nó trả về tất cả các phần tử giả sử rằng ngữ cảnh đó là ngữ cảnh danh sách. Tiếp theo, chúng tôi sử dụng cùng một mảng và cố gắng lưu trữ mảng này dưới dạng vô hướng, vì vậy trong trường hợp này, nó chỉ trả về số phần tử trong mảng này giả sử rằng ngữ cảnh đó là ngữ cảnh vô hướng. Bảng sau liệt kê các ngữ cảnh khác nhau -

Sr.No. Bối cảnh & Mô tả
1

Scalar

Việc gán cho một biến vô hướng đánh giá phía bên phải trong ngữ cảnh vô hướng.

2

List

Phép gán cho một mảng hoặc một hàm băm đánh giá phía bên phải trong ngữ cảnh danh sách.

3

Boolean

Bối cảnh Boolean chỉ đơn giản là bất kỳ nơi nào mà một biểu thức đang được đánh giá để xem liệu nó đúng hay sai.

4

Void

Bối cảnh này không chỉ không quan tâm giá trị trả về là gì mà thậm chí còn không muốn giá trị trả về.

5

Interpolative

Bối cảnh này chỉ xảy ra bên trong dấu ngoặc kép hoặc những thứ hoạt động như dấu ngoặc kép.

Vô hướng là một đơn vị dữ liệu duy nhất. Dữ liệu đó có thể là một số nguyên, dấu phẩy động, một ký tự, một chuỗi, một đoạn văn hoặc toàn bộ trang web.

Đây là một ví dụ đơn giản về việc sử dụng các biến vô hướng:

#!/usr/bin/perl

$age = 25; # An integer assignment $name = "John Paul";   # A string 
$salary = 1445.50; # A floating point print "Age = $age\n";
print "Name = $name\n"; print "Salary = $salary\n";

Điều này sẽ tạo ra kết quả sau:

Age = 25
Name = John Paul
Salary = 1445.5

Vô hướng số

Một đại lượng vô hướng thường là một số hoặc một chuỗi. Ví dụ sau minh họa việc sử dụng các loại vô hướng số khác nhau:

#!/usr/bin/perl

$integer = 200; $negative = -300;
$floating = 200.340; $bigfloat = -1.2E-23;

# 377 octal, same as 255 decimal
$octal = 0377; # FF hex, also 255 decimal $hexa = 0xff;

print "integer = $integer\n"; print "negative = $negative\n";
print "floating = $floating\n"; print "bigfloat = $bigfloat\n";
print "octal = $octal\n"; print "hexa = $hexa\n";

Điều này sẽ tạo ra kết quả sau:

integer = 200
negative = -300
floating = 200.34
bigfloat = -1.2e-23
octal = 255
hexa = 255

Chuỗi vô hướng

Ví dụ sau minh họa việc sử dụng nhiều loại chuỗi vô hướng khác nhau. Lưu ý sự khác biệt giữa chuỗi được trích dẫn đơn và chuỗi được trích dẫn kép -

#!/usr/bin/perl

$var = "This is string scalar!"; $quote = 'I m inside single quote - $var'; $double = "This is inside single quote - $var"; $escape = "This example of escape -\tHello, World!";

print "var = $var\n"; print "quote = $quote\n";
print "double = $double\n"; print "escape = $escape\n";

Điều này sẽ tạo ra kết quả sau:

var = This is string scalar!
quote = I m inside single quote - $var
double = This is inside single quote - This is string scalar!
escape = This example of escape -       Hello, World

Hoạt động vô hướng

Bạn sẽ thấy chi tiết về các toán tử khác nhau có sẵn trong Perl trong một chương riêng biệt, nhưng ở đây chúng tôi sẽ liệt kê một số phép toán số và chuỗi.

#!/usr/bin/perl

$str = "hello" . "world";       # Concatenates strings.
$num = 5 + 10; # adds two numbers. $mul = 4 * 5;                   # multiplies two numbers.
$mix = $str . $num; # concatenates string and number. print "str = $str\n";
print "num = $num\n"; print "mix = $mix\n";

Điều này sẽ tạo ra kết quả sau:

str = helloworld
num = 15
mul = 20
mix = helloworld15

Chuỗi nhiều dòng

Nếu bạn muốn đưa chuỗi nhiều dòng vào chương trình của mình, bạn có thể sử dụng các dấu ngoặc kép tiêu chuẩn như bên dưới:

#!/usr/bin/perl

$string = 'This is a multiline string'; print "$string\n";

Điều này sẽ tạo ra kết quả sau:

This is
a multiline
string

Bạn cũng có thể sử dụng cú pháp tài liệu "tại đây" để lưu trữ hoặc in nhiều dòng như bên dưới:

#!/usr/bin/perl

print <<EOF;
This is
a multiline
string
EOF

Điều này cũng sẽ tạo ra kết quả tương tự -

This is
a multiline
string

V-Strings

Một ký tự có dạng v1.20.300.4000 được phân tích cú pháp dưới dạng một chuỗi bao gồm các ký tự có thứ tự được chỉ định. Dạng này được gọi là v-string.

Chuỗi v cung cấp một cách thay thế và dễ đọc hơn để tạo chuỗi, thay vì sử dụng dạng nội suy hơi khó đọc hơn "\ x {1} \ x {14} \ x {12c} \ x {fa0}".

Chúng là bất kỳ chữ nào bắt đầu bằng av và theo sau là một hoặc nhiều phần tử được phân tách bằng dấu chấm. Ví dụ -

#!/usr/bin/perl

$smile = v9786; $foo    = v102.111.111;
$martin = v77.97.114.116.105.110; print "smile = $smile\n";
print "foo = $foo\n"; print "martin = $martin\n";

Điều này cũng sẽ tạo ra kết quả tương tự -

smile = ☺
foo = foo
martin = Martin
Wide character in print at main.pl line 7.

Chữ viết đặc biệt

Đến đây chắc hẳn bạn đã có cảm giác về chuỗi vô hướng và phép nối và phép nội suy của nó. Vì vậy, hãy để tôi cho bạn biết về ba ký tự đặc biệt __FILE__, __LINE__ và __PACKAGE__ đại diện cho tên tệp, số dòng và tên gói hiện tại tại thời điểm đó trong chương trình của bạn.

Chúng chỉ có thể được sử dụng như các mã thông báo riêng biệt và sẽ không được nội suy thành chuỗi. Kiểm tra ví dụ dưới đây -

#!/usr/bin/perl

print "File name ". __FILE__ . "\n";
print "Line Number " . __LINE__ ."\n";
print "Package " . __PACKAGE__ ."\n";

# they can not be interpolated
print "__FILE__ __LINE__ __PACKAGE__\n";

Điều này sẽ tạo ra kết quả sau:

File name hello.pl
Line Number 4
Package main
__FILE__ __LINE__ __PACKAGE__

Mảng là một biến lưu trữ một danh sách có thứ tự các giá trị vô hướng. Các biến mảng được đặt trước dấu "at" (@). Để tham chiếu đến một phần tử duy nhất của mảng, bạn sẽ sử dụng ký hiệu đô la ($) với tên biến theo sau là chỉ số của phần tử trong dấu ngoặc vuông.

Đây là một ví dụ đơn giản về việc sử dụng các biến mảng:

#!/usr/bin/perl

@ages = (25, 30, 40);             
@names = ("John Paul", "Lisa", "Kumar");

print "\$ages[0] = $ages[0]\n"; print "\$ages[1] = $ages[1]\n"; print "\$ages[2] = $ages[2]\n"; print "\$names[0] = $names[0]\n"; print "\$names[1] = $names[1]\n"; print "\$names[2] = $names[2]\n";

Ở đây, chúng tôi đã sử dụng dấu thoát (\) trước dấu $ chỉ để in nó. Perl khác sẽ hiểu nó như một biến và sẽ in ra giá trị của nó. Khi được thực thi, điều này sẽ tạo ra kết quả sau:

$ages[0] = 25 $ages[1] = 30
$ages[2] = 40 $names[0] = John Paul
$names[1] = Lisa $names[2] = Kumar

Trong Perl, các thuật ngữ Danh sách và Mảng thường được sử dụng như thể chúng có thể hoán đổi cho nhau. Nhưng danh sách là dữ liệu và mảng là biến.

Tạo mảng

Biến mảng được bắt đầu bằng dấu @ và được điền bằng cách sử dụng dấu ngoặc đơn hoặc toán tử qw. Ví dụ -

@array = (1, 2, 'Hello');
@array = qw/This is an array/;

Dòng thứ hai sử dụng toán tử qw //, trả về danh sách các chuỗi, phân tách chuỗi được phân tách bằng khoảng trắng. Trong ví dụ này, điều này dẫn đến một mảng bốn phần tử; phần tử đầu tiên là 'this' và phần tử cuối cùng (thứ tư) là 'mảng'. Điều này có nghĩa là bạn có thể sử dụng các dòng khác nhau như sau:

@days = qw/Monday
Tuesday
...
Sunday/;

Bạn cũng có thể điền một mảng bằng cách gán từng giá trị riêng lẻ như sau:

$array[0] = 'Monday'; ... $array[6] = 'Sunday';

Truy cập các phần tử mảng

Khi truy cập các phần tử riêng lẻ từ một mảng, bạn phải đặt trước biến bằng dấu đô la ($), sau đó nối chỉ mục phần tử trong dấu ngoặc vuông sau tên của biến. Ví dụ -

#!/usr/bin/perl

@days = qw/Mon Tue Wed Thu Fri Sat Sun/;

print "$days[0]\n";
print "$days[1]\n"; print "$days[2]\n";
print "$days[6]\n"; print "$days[-1]\n";
print "$days[-7]\n";

Điều này sẽ tạo ra kết quả sau:

Mon
Tue
Wed
Sun
Sun
Mon

Chỉ số mảng bắt đầu từ số 0, vì vậy để truy cập phần tử đầu tiên, bạn cần cung cấp 0 làm chỉ số. Bạn cũng có thể đưa ra một chỉ số âm, trong trường hợp đó bạn chọn phần tử từ cuối chứ không phải phần đầu của mảng. Điều này có nghĩa như sau -

print $days[-1]; # outputs Sun
print $days[-7]; # outputs Mon

Mảng số tuần tự

Perl cung cấp một phím tắt cho các số và chữ cái liên tiếp. Thay vì gõ ra từng phần tử khi đếm đến 100 chẳng hạn, chúng ta có thể làm như sau:

#!/usr/bin/perl

@var_10 = (1..10);
@var_20 = (10..20);
@var_abc = (a..z);

print "@var_10\n";   # Prints number from 1 to 10
print "@var_20\n";   # Prints number from 10 to 20
print "@var_abc\n";  # Prints number from a to z

Ở đây dấu chấm kép (..) được gọi là range operator. Điều này sẽ tạo ra kết quả sau:

1 2 3 4 5 6 7 8 9 10
10 11 12 13 14 15 16 17 18 19 20
a b c d e f g h i j k l m n o p q r s t u v w x y z

Kích thước mảng

Kích thước của một mảng có thể được xác định bằng cách sử dụng ngữ cảnh vô hướng trên mảng - giá trị trả về sẽ là số phần tử trong mảng -

@array = (1,2,3);
print "Size: ",scalar @array,"\n";

Giá trị trả về sẽ luôn là kích thước vật lý của mảng, không phải là số phần tử hợp lệ. Bạn có thể chứng minh điều này và sự khác biệt giữa mảng @array và $ # vô hướng, bằng cách sử dụng đoạn này như sau:

#!/usr/bin/perl

@array = (1,2,3);
$array[50] = 4; $size = @array;
$max_index = $#array;

print "Size:  $size\n"; print "Max Index: $max_index\n";

Điều này sẽ tạo ra kết quả sau:

Size: 51
Max Index: 50

Chỉ có bốn phần tử trong mảng chứa thông tin, nhưng mảng dài 51 phần tử, với chỉ số cao nhất là 50.

Thêm và xóa phần tử trong mảng

Perl cung cấp một số hàm hữu ích để thêm và xóa các phần tử trong một mảng. Bạn có thể có câu hỏi một hàm là gì? Cho đến nay bạn đã sử dụngprintchức năng in các giá trị khác nhau. Tương tự, có nhiều chức năng khác hoặc đôi khi được gọi là thói quen con, có thể được sử dụng cho nhiều chức năng khác.

Sr.No. Loại & Mô tả
1

push @ARRAY, LIST

Đẩy các giá trị của danh sách vào cuối mảng.

2

pop @ARRAY

Dừng và trả về giá trị cuối cùng của mảng.

3

shift @ARRAY

Dịch chuyển giá trị đầu tiên của mảng ra và trả về giá trị đó, rút ​​ngắn mảng 1 và di chuyển mọi thứ xuống dưới.

4

unshift @ARRAY, LIST

Thêm danh sách vào trước mảng và trả về số phần tử trong mảng mới.

#!/usr/bin/perl

# create a simple array
@coins = ("Quarter","Dime","Nickel");
print "1. \@coins  = @coins\n";

# add one element at the end of the array
push(@coins, "Penny");
print "2. \@coins  = @coins\n";

# add one element at the beginning of the array
unshift(@coins, "Dollar");
print "3. \@coins  = @coins\n";

# remove one element from the last of the array.
pop(@coins);
print "4. \@coins  = @coins\n";

# remove one element from the beginning of the array.
shift(@coins);
print "5. \@coins  = @coins\n";

Điều này sẽ tạo ra kết quả sau:

1. @coins = Quarter Dime Nickel
2. @coins = Quarter Dime Nickel Penny
3. @coins = Dollar Quarter Dime Nickel Penny
4. @coins = Dollar Quarter Dime Nickel
5. @coins = Quarter Dime Nickel

Cắt các phần tử mảng

Bạn cũng có thể trích xuất một "lát cắt" từ một mảng - nghĩa là bạn có thể chọn nhiều hơn một mục từ một mảng để tạo ra một mảng khác.

#!/usr/bin/perl

@days = qw/Mon Tue Wed Thu Fri Sat Sun/;

@weekdays = @days[3,4,5];

print "@weekdays\n";

Điều này sẽ tạo ra kết quả sau:

Thu Fri Sat

Đặc tả cho một lát cắt phải có danh sách các chỉ số hợp lệ, dương hoặc âm, mỗi chỉ số được phân tách bằng dấu phẩy. Để tăng tốc độ, bạn cũng có thể sử dụng.. toán tử phạm vi -

#!/usr/bin/perl

@days = qw/Mon Tue Wed Thu Fri Sat Sun/;

@weekdays = @days[3..5];

print "@weekdays\n";

Điều này sẽ tạo ra kết quả sau:

Thu Fri Sat

Thay thế các phần tử mảng

Bây giờ chúng tôi sẽ giới thiệu một hàm nữa được gọi là splice(), có cú pháp sau:

splice @ARRAY, OFFSET [ , LENGTH [ , LIST ] ]

Hàm này sẽ xóa các phần tử của @ARRAY được chỉ định bởi OFFSET và LENGTH, và thay thế chúng bằng LIST, nếu được chỉ định. Cuối cùng, nó trả về các phần tử bị xóa khỏi mảng. Sau đây là ví dụ -

#!/usr/bin/perl

@nums = (1..20);
print "Before - @nums\n";

splice(@nums, 5, 5, 21..25); 
print "After - @nums\n";

Điều này sẽ tạo ra kết quả sau:

Before - 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
After - 1 2 3 4 5 21 22 23 24 25 11 12 13 14 15 16 17 18 19 20

Ở đây, sự thay thế thực sự bắt đầu với số thứ 6 sau đó năm phần tử sau đó được thay thế từ 6 thành 10 bằng các số 21, 22, 23, 24 và 25.

Chuyển đổi chuỗi thành mảng

Hãy xem xét một hàm nữa được gọi là split(), có cú pháp sau:

split [ PATTERN [ , EXPR [ , LIMIT ] ] ]

Hàm này chia một chuỗi thành một mảng chuỗi và trả về nó. Nếu LIMIT được chỉ định, hãy chia thành nhiều nhất số trường đó. Nếu PATTERN bị bỏ qua, phân tách trên khoảng trắng. Sau đây là ví dụ -

#!/usr/bin/perl

# define Strings
$var_string = "Rain-Drops-On-Roses-And-Whiskers-On-Kittens"; $var_names = "Larry,David,Roger,Ken,Michael,Tom";

# transform above strings into arrays.
@string = split('-', $var_string); @names = split(',', $var_names);

print "$string[3]\n"; # This will print Roses print "$names[4]\n";   # This will print Michael

Điều này sẽ tạo ra kết quả sau:

Roses
Michael

Chuyển đổi Mảng thành Chuỗi

Chúng ta có thể sử dụng join()hàm để nối lại các phần tử của mảng và tạo thành một chuỗi dài vô hướng. Hàm này có cú pháp sau:

join EXPR, LIST

Hàm này nối các chuỗi riêng biệt của LIST thành một chuỗi duy nhất với các trường được phân tách bằng giá trị EXPR và trả về chuỗi. Sau đây là ví dụ -

#!/usr/bin/perl

# define Strings
$var_string = "Rain-Drops-On-Roses-And-Whiskers-On-Kittens"; $var_names = "Larry,David,Roger,Ken,Michael,Tom";

# transform above strings into arrays.
@string = split('-', $var_string); @names = split(',', $var_names);

$string1 = join( '-', @string ); $string2 = join( ',', @names );

print "$string1\n"; print "$string2\n";

Điều này sẽ tạo ra kết quả sau:

Rain-Drops-On-Roses-And-Whiskers-On-Kittens
Larry,David,Roger,Ken,Michael,Tom

Sắp xếp Mảng

Các sort()hàm sắp xếp từng phần tử của mảng theo tiêu chuẩn ASCII Numeric. Hàm này có cú pháp sau:

sort [ SUBROUTINE ] LIST

Hàm này sắp xếp DANH SÁCH và trả về giá trị mảng đã sắp xếp. Nếu SUBROUTINE được chỉ định thì logic được chỉ định bên trong SUBTROUTINE được áp dụng trong khi sắp xếp các phần tử.

#!/usr/bin/perl

# define an array
@foods = qw(pizza steak chicken burgers);
print "Before: @foods\n";

# sort this array
@foods = sort(@foods);
print "After: @foods\n";

Điều này sẽ tạo ra kết quả sau:

Before: pizza steak chicken burgers
After: burgers chicken pizza steak

Xin lưu ý rằng việc sắp xếp được thực hiện dựa trên giá trị Số ASCII của các từ. Vì vậy, tùy chọn tốt nhất là trước tiên chuyển mọi phần tử của mảng thành các chữ cái thường và sau đó thực hiện chức năng sắp xếp.

Hợp nhất Mảng

Bởi vì một mảng chỉ là một chuỗi giá trị được phân tách bằng dấu phẩy, bạn có thể kết hợp chúng với nhau như hình dưới đây:

#!/usr/bin/perl

@numbers = (1,3,(4,5,6));

print "numbers = @numbers\n";

Điều này sẽ tạo ra kết quả sau:

numbers = 1 3 4 5 6

Các mảng được nhúng chỉ trở thành một phần của mảng chính như hình dưới đây -

#!/usr/bin/perl

@odd = (1,3,5);
@even = (2, 4, 6);

@numbers = (@odd, @even);

print "numbers = @numbers\n";

Điều này sẽ tạo ra kết quả sau:

numbers = 1 3 5 2 4 6

Chọn các phần tử từ danh sách

Ký hiệu danh sách giống như ký hiệu cho mảng. Bạn có thể trích xuất một phần tử từ một mảng bằng cách thêm dấu ngoặc vuông vào danh sách và đưa ra một hoặc nhiều chỉ số -

#!/usr/bin/perl

$var = (5,4,3,2,1)[4]; print "value of var = $var\n"

Điều này sẽ tạo ra kết quả sau:

value of var = 1

Tương tự, chúng ta có thể trích xuất các lát, mặc dù không yêu cầu ký tự @ đứng đầu -

#!/usr/bin/perl

@list = (5,4,3,2,1)[1..3];

print "Value of list = @list\n";

Điều này sẽ tạo ra kết quả sau:

Value of list = 4 3 2

Hàm băm là một tập hợp của key/valuecặp. Các biến băm được đặt trước bằng dấu phần trăm (%). Để tham chiếu đến một phần tử duy nhất của hàm băm, bạn sẽ sử dụng tên biến băm được đặt trước dấu "$" và theo sau là "khóa" được liên kết với giá trị trong dấu ngoặc nhọn ..

Đây là một ví dụ đơn giản về việc sử dụng các biến băm -

#!/usr/bin/perl

%data = ('John Paul', 45, 'Lisa', 30, 'Kumar', 40);

print "\$data{'John Paul'} = $data{'John Paul'}\n"; print "\$data{'Lisa'} = $data{'Lisa'}\n"; print "\$data{'Kumar'} = $data{'Kumar'}\n";

Điều này sẽ tạo ra kết quả sau:

$data{'John Paul'} = 45
$data{'Lisa'} = 30 $data{'Kumar'} = 40

Tạo mã băm

Hàm băm được tạo theo một trong hai cách sau. Trong phương pháp đầu tiên, bạn chỉ định một giá trị cho một khóa được đặt tên trên cơ sở từng cái một -

$data{'John Paul'} = 45; $data{'Lisa'} = 30;
$data{'Kumar'} = 40;

Trong trường hợp thứ hai, bạn sử dụng một danh sách, được chuyển đổi bằng cách lấy các cặp riêng lẻ từ danh sách: phần tử đầu tiên của cặp được sử dụng làm khóa và phần tử thứ hai làm giá trị. Ví dụ -

%data = ('John Paul', 45, 'Lisa', 30, 'Kumar', 40);

Để rõ ràng, bạn có thể sử dụng => làm bí danh cho, để chỉ ra các cặp khóa / giá trị như sau:

%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);

Đây là một biến thể nữa của biểu mẫu trên, hãy xem nó, ở đây tất cả các khóa đã được đặt trước dấu gạch ngang (-) và không cần dấu ngoặc kép xung quanh chúng -

%data = (-JohnPaul => 45, -Lisa => 30, -Kumar => 40);

Nhưng điều quan trọng cần lưu ý là có một từ duy nhất, tức là các phím không có dấu cách đã được sử dụng trong hình thức tạo băm này và nếu bạn xây dựng hàm băm theo cách này thì các khóa sẽ được truy cập chỉ bằng dấu gạch nối như hình dưới đây.

$val = %data{-JohnPaul}
$val = %data{-Lisa}

Truy cập các phần tử băm

Khi truy cập các phần tử riêng lẻ từ một hàm băm, bạn phải đặt trước biến bằng dấu đô la ($), sau đó nối khóa phần tử trong dấu ngoặc nhọn sau tên của biến. Ví dụ -

#!/usr/bin/perl

%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);

print "$data{'John Paul'}\n"; print "$data{'Lisa'}\n";
print "$data{'Kumar'}\n";

Điều này sẽ tạo ra kết quả sau:

45
30
40

Giải nén các lát

Bạn có thể trích xuất các lát của băm cũng giống như bạn có thể trích xuất các lát từ một mảng. Bạn sẽ cần sử dụng tiền tố @ cho biến để lưu trữ giá trị trả về vì chúng sẽ là danh sách các giá trị -

#!/uer/bin/perl


%data = (-JohnPaul => 45, -Lisa => 30, -Kumar => 40);

@array = @data{-JohnPaul, -Lisa};

print "Array : @array\n";

Điều này sẽ tạo ra kết quả sau:

Array : 45 30

Trích xuất các khóa và giá trị

Bạn có thể lấy danh sách tất cả các khóa từ hàm băm bằng cách sử dụng keys , có cú pháp sau:

keys %HASH

Hàm này trả về một mảng tất cả các khóa của hàm băm được đặt tên. Sau đây là ví dụ -

#!/usr/bin/perl 

%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);

@names = keys %data;

print "$names[0]\n";
print "$names[1]\n"; print "$names[2]\n";

Điều này sẽ tạo ra kết quả sau:

Lisa
John Paul
Kumar

Tương tự, bạn có thể sử dụng valueshàm để lấy danh sách tất cả các giá trị. Hàm này có cú pháp sau:

values %HASH

Hàm này trả về một mảng bình thường bao gồm tất cả các giá trị của hàm băm được đặt tên. Sau đây là ví dụ -

#!/usr/bin/perl 

%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);

@ages = values %data;

print "$ages[0]\n"; print "$ages[1]\n";
print "$ages[2]\n";

Điều này sẽ tạo ra kết quả sau:

30
45
40

Kiểm tra sự tồn tại

Nếu bạn cố gắng truy cập vào một cặp khóa / giá trị từ một hàm băm không tồn tại, thông thường bạn sẽ nhận được undefinedvà nếu bạn đã bật cảnh báo, thì bạn sẽ nhận được cảnh báo được tạo tại thời điểm chạy. Bạn có thể giải quyết vấn đề này bằng cách sử dụngexists , trả về true nếu khóa được đặt tên tồn tại, bất kể giá trị của nó có thể là gì -

#!/usr/bin/perl

%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);

if( exists($data{'Lisa'} ) ) {
   print "Lisa is $data{'Lisa'} years old\n";
} else {
   print "I don't know age of Lisa\n";
}

Ở đây chúng tôi đã giới thiệu câu lệnh IF ... ELSE, mà chúng tôi sẽ nghiên cứu trong một chương riêng. Còn bây giờ bạn cứ cho rằngif( condition ) một phần sẽ chỉ được thực thi khi điều kiện đã cho là đúng. elsemột phần sẽ được thực thi. Vì vậy, khi chúng ta thực hiện chương trình trên, nó tạo ra kết quả như sau vì ở đây điều kiện đã cho tồn tại ($ data {'Lisa'} trả về true -

Lisa is 30 years old

Nhận kích thước băm

Bạn có thể lấy kích thước - nghĩa là số phần tử từ một hàm băm bằng cách sử dụng ngữ cảnh vô hướng trên các khóa hoặc giá trị. Nói một cách đơn giản, đầu tiên bạn phải lấy một mảng gồm các khóa hoặc giá trị và sau đó bạn có thể nhận được kích thước của mảng như sau:

#!/usr/bin/perl

%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);

@keys = keys %data;
$size = @keys; print "1 - Hash size: is $size\n";

@values = values %data;
$size = @values; print "2 - Hash size: is $size\n";

Điều này sẽ tạo ra kết quả sau:

1 - Hash size: is 3
2 - Hash size: is 3

Thêm và loại bỏ các phần tử trong băm

Việc thêm một cặp khóa / giá trị mới có thể được thực hiện với một dòng mã bằng cách sử dụng toán tử gán đơn giản. Nhưng để xóa một phần tử khỏi hàm băm, bạn cần sử dụngdelete chức năng như được hiển thị bên dưới trong ví dụ:

#!/usr/bin/perl

%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);
@keys = keys %data;
$size = @keys; print "1 - Hash size: is $size\n";

# adding an element to the hash;
$data{'Ali'} = 55; @keys = keys %data; $size = @keys;
print "2 - Hash size:  is $size\n"; # delete the same element from the hash; delete $data{'Ali'};
@keys = keys %data;
$size = @keys; print "3 - Hash size: is $size\n";

Điều này sẽ tạo ra kết quả sau:

1 - Hash size: is 3
2 - Hash size: is 4
3 - Hash size: is 3

Các câu lệnh điều kiện Perl giúp đưa ra quyết định, yêu cầu người lập trình chỉ định một hoặc nhiều điều kiện để được đánh giá hoặc kiểm tra bởi chương trình, cùng với một câu lệnh hoặc các câu lệnh sẽ được thực thi nếu điều kiện đó được xác định là đúng và tùy chọn khác câu lệnh được thực hiện nếu điều kiện được xác định là sai.

Sau đây là khái quát từ cấu trúc ra quyết định điển hình được tìm thấy trong hầu hết các ngôn ngữ lập trình:

Số 0, chuỗi '0' và "", danh sách trống () và undef đều là false trong ngữ cảnh boolean và tất cả các giá trị khác là true. Phủ định một giá trị thực bởi! hoặc là not trả về một giá trị sai đặc biệt.

Ngôn ngữ lập trình Perl cung cấp các loại câu lệnh điều kiện sau.

Sr.No. Tuyên bố & Mô tả
1 câu lệnh if

An if statement bao gồm một biểu thức boolean theo sau bởi một hoặc nhiều câu lệnh.

2 câu lệnh if ... else

An if statement có thể được theo sau bởi một tùy chọn else statement.

3 câu lệnh if ... elsif ... else

An if statement có thể được theo sau bởi một tùy chọn elsif statement và sau đó là tùy chọn else statement.

4 trừ khi tuyên bố

An unless statement bao gồm một biểu thức boolean theo sau bởi một hoặc nhiều câu lệnh.

5 trừ khi ... tuyên bố khác

An unless statement có thể được theo sau bởi một tùy chọn else statement.

6 trừ khi ... elsif..else statement

An unless statement có thể được theo sau bởi một tùy chọn elsif statement và sau đó là tùy chọn else statement.

7 chuyển đổi tuyên bố

Với các phiên bản mới nhất của Perl, bạn có thể sử dụng switchtuyên bố. cho phép một cách đơn giản để so sánh một giá trị biến với các điều kiện khác nhau.

Các ? : Nhà điều hành

Hãy kiểm tra conditional operator ? :có thể được sử dụng để thay thế if...elsecác câu lệnh. Nó có dạng chung sau:

Exp1 ? Exp2 : Exp3;

Trong đó Exp1, Exp2 và Exp3 là các biểu thức. Chú ý công dụng và vị trí của dấu hai chấm.

Giá trị của a? biểu thức được xác định như thế này: Exp1 được đánh giá. Nếu nó là true, thì Exp2 được đánh giá và trở thành giá trị của toàn bộ? biểu hiện. Nếu Exp1 là false, thì Exp3 được đánh giá và giá trị của nó trở thành giá trị của biểu thức. Dưới đây là một ví dụ đơn giản về việc sử dụng toán tử này:

#!/usr/local/bin/perl
 
$name = "Ali"; $age = 10;

$status = ($age > 60 )? "A senior citizen" : "Not a senior citizen";

print "$name is - $status\n";

Điều này sẽ tạo ra kết quả sau:

Ali is - Not a senior citizen

Có thể có một tình huống khi bạn cần thực thi một khối mã nhiều lần. Nói chung, các câu lệnh được thực hiện tuần tự: Câu lệnh đầu tiên trong một hàm được thực hiện đầu tiên, tiếp theo là câu lệnh thứ hai, v.v.

Các ngôn ngữ lập trình cung cấp các cấu trúc điều khiển khác nhau cho phép các đường dẫn thực thi phức tạp hơn.

Câu lệnh lặp cho phép chúng ta thực hiện một câu lệnh hoặc một nhóm câu lệnh nhiều lần và sau đây là dạng chung của câu lệnh lặp trong hầu hết các ngôn ngữ lập trình:

Ngôn ngữ lập trình Perl cung cấp các loại vòng lặp sau để xử lý các yêu cầu lặp.

Sr.No. Loại vòng lặp & Mô tả
1 trong khi lặp lại

Lặp lại một câu lệnh hoặc một nhóm câu lệnh trong khi một điều kiện đã cho là đúng. Nó kiểm tra điều kiện trước khi thực thi phần thân của vòng lặp.

2 vòng lặp cho đến khi

Lặp lại một câu lệnh hoặc một nhóm câu lệnh cho đến khi một điều kiện nhất định trở thành đúng. Nó kiểm tra điều kiện trước khi thực thi phần thân của vòng lặp.

3 vòng lặp for

Thực thi một chuỗi các câu lệnh nhiều lần và viết tắt mã quản lý biến vòng lặp.

4 vòng lặp foreach

Vòng lặp foreach lặp qua một giá trị danh sách bình thường và đặt biến VAR lần lượt là từng phần tử của danh sách.

5 vòng lặp do ... while

Giống như một câu lệnh while, ngoại trừ việc nó kiểm tra điều kiện ở cuối thân vòng lặp

6 vòng lồng nhau

Bạn có thể sử dụng một hoặc nhiều vòng lặp bên trong bất kỳ vòng lặp while, for hoặc do.. while nào khác.

Tuyên bố kiểm soát vòng lặp

Các câu lệnh điều khiển vòng lặp thay đổi việc thực thi từ trình tự bình thường của nó. Khi việc thực thi rời khỏi một phạm vi, tất cả các đối tượng tự động được tạo trong phạm vi đó sẽ bị phá hủy.

Perl hỗ trợ các câu lệnh điều khiển sau. Nhấp vào các liên kết sau để kiểm tra chi tiết của chúng.

Sr.No. Tuyên bố & Mô tả Kiểm soát
1 tuyên bố tiếp theo

Làm cho vòng lặp bỏ qua phần còn lại của phần thân và ngay lập tức kiểm tra lại tình trạng của nó trước khi nhắc lại.

2 thông điệp cuối cùng

Kết thúc câu lệnh vòng lặp và chuyển việc thực thi câu lệnh ngay sau vòng lặp.

3 tiếp tục tuyên bố

Một KHỐI tiếp tục, nó luôn được thực thi ngay trước khi điều kiện sắp được đánh giá lại.

4 làm lại tuyên bố

Lệnh redo khởi động lại khối vòng lặp mà không đánh giá lại điều kiện. Khối tiếp tục, nếu có, không được thực thi.

5 tuyên bố goto

Perl hỗ trợ lệnh goto với ba dạng: goto label, goto expr, goto & name.

Vòng lặp vô hạn

Một vòng lặp trở thành vòng lặp vô hạn nếu một điều kiện không bao giờ trở thành sai. Cácforvòng lặp thường được sử dụng cho mục đích này. Vì không có biểu thức nào trong ba biểu thức tạo thànhfor vòng lặp là bắt buộc, bạn có thể tạo một vòng lặp vô tận bằng cách để trống biểu thức điều kiện.

#!/usr/local/bin/perl
 
for( ; ; ) {
   printf "This loop will run forever.\n";
}

Bạn có thể kết thúc vòng lặp vô hạn ở trên bằng cách nhấn các phím Ctrl + C.

Khi biểu thức điều kiện vắng mặt, nó được giả định là đúng. Bạn có thể có một biểu thức khởi tạo và tăng dần, nhưng là một lập trình viên thường sử dụng cấu trúc for (;;) để biểu thị một vòng lặp vô hạn.

Nhà điều hành là gì?

Câu trả lời đơn giản có thể được đưa ra bằng cách sử dụng biểu thức 4 + 5 bằng 9 . Ở đây 4 và 5 được gọi là toán hạng và + được gọi là toán tử. Ngôn ngữ Perl hỗ trợ nhiều kiểu toán tử, nhưng sau đây là danh sách các toán tử quan trọng và được sử dụng thường xuyên nhất:

  • Toán tử số học
  • Các nhà điều hành bình đẳng
  • Toán tử logic
  • Người điều hành nhiệm vụ
  • Toán tử Bitwise
  • Toán tử logic
  • Các toán tử giống như trích dẫn
  • Các nhà khai thác khác

Chúng ta hãy xem xét tất cả các toán tử một.

Toán tử số học Perl

Giả sử biến $a holds 10 and variable $b giữ 20, sau đó là các toán tử số học Perl:

Hiển thị ví dụ

Sr.No. Nhà điều hành & Mô tả
1

+ ( Addition )

Thêm các giá trị ở hai bên của toán tử

Example - $a + $b sẽ cho 30

2

- (Subtraction)

Trừ toán hạng bên phải khỏi toán hạng bên trái

Example - $a - $b sẽ cho -10

3

* (Multiplication)

Nhân các giá trị ở hai bên của toán tử

Example - $a * $b sẽ cho 200

4

/ (Division)

Chia toán hạng bên trái cho toán hạng bên phải

Example - $b / $a sẽ cho 2

5

% (Modulus)

Chia toán hạng bên trái cho toán hạng bên phải và trả về phần dư

Example - $b % $a sẽ cho 0

6

** (Exponent)

Thực hiện phép tính lũy thừa (lũy thừa) trên các toán tử

Example - $a**$b sẽ cho 10 lũy thừa 20

Toán tử bình đẳng Perl

Đây cũng được gọi là các toán tử quan hệ. Giả sử biến$a holds 10 and variable $b giữ 20 sau đó, hãy kiểm tra các toán tử bình đẳng số sau:

Hiển thị ví dụ

Sr.No. Nhà điều hành & Mô tả
1

== (equal to)

Kiểm tra xem giá trị của hai toán hạng có bằng nhau hay không, nếu có thì điều kiện trở thành true.

Example - ($a == $b) không đúng.

2

!= (not equal to)

Kiểm tra xem giá trị của hai toán hạng có bằng nhau hay không, nếu các giá trị không bằng nhau thì điều kiện trở thành true.

Example - ($a != $b) là đúng.

3

<=>

Kiểm tra xem giá trị của hai toán hạng có bằng nhau hay không và trả về -1, 0 hoặc 1 tùy thuộc vào việc đối số bên trái là số nhỏ hơn, bằng hoặc lớn hơn đối số bên phải.

Example - ($a <=> $b) trả về -1.

4

> (greater than)

Kiểm tra xem giá trị của toán hạng bên trái có lớn hơn giá trị của toán hạng bên phải hay không, nếu có thì điều kiện trở thành true.

Example - ($a > $b) không đúng.

5

< (less than)

Kiểm tra xem giá trị của toán hạng bên trái có nhỏ hơn giá trị của toán hạng bên phải hay không, nếu có thì điều kiện trở thành true.

Example - ($a < $b) là đúng.

6

>= (greater than or equal to)

Kiểm tra xem giá trị của toán hạng bên trái có lớn hơn hoặc bằng giá trị của toán hạng bên phải hay không, nếu có thì điều kiện trở thành true.

Example - ($a >= $b) không đúng.

7

<= (less than or equal to)

Kiểm tra xem giá trị của toán hạng bên trái có nhỏ hơn hoặc bằng giá trị của toán hạng bên phải hay không, nếu có thì điều kiện trở thành true.

Example - ($a <= $b) là đúng.

Dưới đây là danh sách các nhà khai thác vốn chủ sở hữu. Giả sử biến$a holds "abc" and variable $b giữ "xyz" sau đó, hãy kiểm tra các toán tử bình đẳng chuỗi sau:

Hiển thị ví dụ

Sr.No. Nhà điều hành & Mô tả
1

lt

Trả về true nếu đối số bên trái nhỏ hơn đối số bên phải.

Example - ($a lt $b) là đúng.

2

gt

Trả về true nếu đối số bên trái lớn hơn đối số bên phải.

Example - ($a gt $b) là sai.

3

le

Trả về true nếu đối số bên trái nhỏ hơn hoặc bằng đối số bên phải.

Example - ($a le $b) là đúng.

4

ge

Trả về true nếu đối số bên trái lớn hơn hoặc bằng đối số bên phải.

Example - ($a ge $b) là sai.

5

eq

Trả về true nếu đối số bên trái ngang với đối số bên phải.

Example - ($a eq $b) là sai.

6

ne

Trả về true nếu đối số bên trái không bằng đối số bên phải.

Example - ($a ne $b) là đúng.

7

cmp

Trả về -1, 0 hoặc 1 tùy thuộc vào việc đối số bên trái nhỏ hơn, bằng hoặc lớn hơn đối số bên phải.

Example - ($a cmp $b) là -1.

Các toán tử chuyển nhượng Perl

Giả sử biến $a holds 10 and variable $b chứa 20, sau đó dưới đây là các toán tử gán có sẵn trong Perl và cách sử dụng chúng -

Hiển thị ví dụ

Sr.No. Nhà điều hành & Mô tả
1

=

Toán tử gán đơn giản, Gán giá trị từ toán hạng bên phải sang toán hạng bên trái

Example - $c = $a + $b will assigned value of $a + $b into $c

2

+=

Thêm toán tử gán AND, Nó thêm toán hạng bên phải vào toán hạng bên trái và gán kết quả cho toán hạng bên trái

Example - $c += $a tương đương với $c = $c + $ a

3

-=

Trừ toán tử gán AND, Nó trừ toán hạng bên phải khỏi toán hạng bên trái và gán kết quả cho toán hạng bên trái

Example - $ c - = $a is equivalent to $c = $c - $a

4

*=

Nhân toán tử gán AND, Nó nhân toán hạng phải với toán hạng trái và gán kết quả cho toán hạng trái

Example - $c *= $a tương đương với $c = $c * $ a

5

/=

Toán tử gán AND, Nó chia toán hạng bên trái với toán hạng bên phải và gán kết quả cho toán hạng bên trái

Example - $ c / = $a is equivalent to $c = $c / $a

6

%=

Toán tử gán mô-đun AND, cần mô-đun sử dụng hai toán hạng và gán kết quả cho toán hạng bên trái

Example - $c %= $a tương đương với $c = $c% a

7

**=

Toán tử gán số mũ AND, Thực hiện phép tính lũy thừa (lũy thừa) trên các toán tử và gán giá trị cho toán hạng bên trái

Example - $c **= $a tương đương với $c = $c ** $ a

Toán tử Perl Bitwise

Toán tử bitwise hoạt động trên các bit và thực hiện thao tác từng bit. Giả sử nếu $ a = 60; và $ b = 13; Bây giờ ở định dạng nhị phân, chúng sẽ như sau:

$ a = 0011 1100

$ b = 0000 1101

-----------------

$ a & $ b = 0000 1100

$ a | $ b = 0011 1101

$ a ^ $ b = 0011 0001

~ $ a = 1100 0011

Có các toán tử Bitwise sau được ngôn ngữ Perl hỗ trợ, giả sử nếu $a = 60; and $b = 13

Hiển thị ví dụ

Sr.No. Nhà điều hành & Mô tả
1

&

Toán tử AND nhị phân sao chép một bit vào kết quả nếu nó tồn tại trong cả hai toán hạng.

Example - ($a & $b) sẽ cho 12 là 0000 1100

2

|

Toán tử OR nhị phân sao chép một bit nếu nó tồn tại trong toán hạng khác.

Example - ($a | $b) sẽ cho 61 là 0011 1101

3

^

Toán tử XOR nhị phân sao chép bit nếu nó được đặt trong một toán hạng nhưng không phải cả hai.

Example - ($a ^ $b) sẽ cho 49 là 0011 0001

4

~

Toán tử bổ sung số nhị phân là một ngôi và có sự hoàn hảo của các bit 'lật'.

Example - (~ $ a) sẽ cho -61 là 1100 0011 ở dạng phần bù của 2 do một số nhị phân có dấu.

5

<<

Toán tử dịch chuyển trái nhị phân. Giá trị toán hạng bên trái được di chuyển sang trái bằng số bit được chỉ định bởi toán hạng bên phải.

Example - $ a << 2 sẽ cho 240 là 1111 0000

6

>>

Toán tử Shift phải nhị phân. Giá trị của toán hạng bên trái được di chuyển sang phải bằng số bit được chỉ định bởi toán hạng bên phải.

Example - $ a >> 2 sẽ cho 15 là 0000 1111

Toán tử lôgic Perl

Có các toán tử logic sau được hỗ trợ bởi ngôn ngữ Perl. Giả sử biến $ a giữ đúng và biến $ b giữ sai thì -

Hiển thị ví dụ

Sr.No. Nhà điều hành & Mô tả
1

and

Được gọi là toán tử logic AND. Nếu cả hai toán hạng đều đúng thì điều kiện trở thành đúng.

Example - ($ a và $ b) là false.

2

&&

C-style Toán tử logic AND sao chép một bit vào kết quả nếu nó tồn tại trong cả hai toán hạng.

Example - ($ a && $ b) là sai.

3

or

Được gọi là Toán tử logic HOẶC. Nếu bất kỳ toán hạng nào trong hai toán hạng khác 0 thì điều kiện trở thành true.

Example - ($ a hoặc $ b) là true.

4

||

Toán tử logic OR kiểu C sao chép một bit nếu nó tồn tại trong toán hạng khác.

Example - ($ a || $ b) là true.

5

not

Được gọi là Toán tử logic NOT. Sử dụng để đảo ngược trạng thái logic của toán hạng của nó. Nếu một điều kiện là đúng thì toán tử logic NOT sẽ sai.

Example - not ($ a và $ b) là true.

Các toán tử giống như trích dẫn

Có các toán tử giống như sau được hỗ trợ bởi ngôn ngữ Perl. Trong bảng sau, dấu {} đại diện cho bất kỳ cặp dấu phân cách nào bạn chọn.

Hiển thị ví dụ

Sr.No. Nhà điều hành & Mô tả
1

q{ }

Bao gồm một chuỗi có trong các dấu ngoặc kép

Example - q {abcd} cho 'abcd'

2

qq{ }

Bao gồm một chuỗi có trong dấu ngoặc kép

Example - qq {abcd} cho "abcd"

3

qx{ }

Bao gồm một chuỗi có dấu ngoặc kép in ngược

Example - qx {abcd} cho `abcd`

Các nhà khai thác khác

Có các toán tử linh tinh sau được hỗ trợ bởi ngôn ngữ Perl. Giả sử biến a giữ 10 và biến b giữ 20 thì -

Hiển thị ví dụ

Sr.No. Nhà điều hành & Mô tả
1

.

Toán tử nhị phân dấu chấm (.) Nối hai chuỗi.

Example - Nếu $ a = "abc", $b = "def" then $a. $ b sẽ cho "abcdef"

2

x

Toán tử lặp x trả về một chuỗi bao gồm toán hạng bên trái được lặp lại số lần được chỉ định bởi toán hạng bên phải.

Example - ('-' x 3) sẽ cho ---.

3

..

Toán tử phạm vi .. trả về một danh sách các giá trị đang đếm (tăng lên từng cái) từ giá trị bên trái sang giá trị bên phải

Example - (2..5) sẽ cho (2, 3, 4, 5)

4

++

Toán tử tăng dần tự động tăng giá trị số nguyên lên một

Example - $ a ++ sẽ cho 11

5

--

Toán tử Auto Decrement giảm giá trị số nguyên đi một

Example - $ a-- sẽ cho 9

6

->

Toán tử mũi tên chủ yếu được sử dụng trong việc tham chiếu đến một phương thức hoặc biến từ một đối tượng hoặc tên lớp

Example - $ obj->$a is an example to access variable $a từ đối tượng $ obj.

Quyền ưu tiên của toán tử Perl

Bảng sau liệt kê tất cả các toán tử từ ưu tiên cao nhất đến thấp nhất.

Hiển thị ví dụ

left	terms and list operators (leftward)
left	->
nonassoc	++ --
right	**
right	! ~ \ and unary + and -
left	=~ !~
left	* / % x
left	+ - .
left	<< >>
nonassoc	named unary operators
nonassoc	< > <= >= lt gt le ge
nonassoc	== != <=> eq ne cmp ~~
left	&
left	| ^
left	&&
left	|| //
nonassoc	..  ...
right	?:
right	= += -= *= etc.
left	, =>
nonassoc	list operators (rightward)
right	not
left	and
left	or xor

Chương này sẽ cung cấp cho bạn những hiểu biết cơ bản về cách xử lý và thao tác ngày và giờ trong Perl.

Ngày và giờ hiện tại

Hãy bắt đầu với localtime()hàm, trả về giá trị cho ngày và giờ hiện tại nếu không có đối số. Sau đây là danh sách 9 phần tử được trả về bởilocaltime trong khi sử dụng trong ngữ cảnh danh sách -

sec,     # seconds of minutes from 0 to 61
min,     # minutes of hour from 0 to 59
hour,    # hours of day from 0 to 24
mday,    # day of month from 1 to 31
mon,     # month of year from 0 to 11
year,    # year since 1900
wday,    # days since sunday
yday,    # days since January 1st
isdst    # hours of daylight savings time

Hãy thử ví dụ sau để in các phần tử khác nhau được trả về bởi hàm localtime () -

#!/usr/local/bin/perl
 
@months = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec );
@days = qw(Sun Mon Tue Wed Thu Fri Sat Sun);

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();
print "$mday $months[$mon] $days[$wday]\n";

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

16 Feb Sat

Nếu bạn sẽ sử dụng hàm localtime () trong ngữ cảnh vô hướng, thì nó sẽ trả về ngày và giờ từ múi giờ hiện tại được đặt trong hệ thống. Hãy thử ví dụ sau để in ngày và giờ hiện tại ở định dạng đầy đủ -

#!/usr/local/bin/perl
 
$datestring = localtime();
print "Local date and time $datestring\n";

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

Local date and time Sat Feb 16 06:50:45 2013

Giờ GMT

Chức năng gmtime()hoạt động giống như hàm localtime () nhưng các giá trị trả về được bản địa hóa cho múi giờ Greenwich chuẩn. Khi được gọi trong ngữ cảnh danh sách, $ isdst, giá trị cuối cùng do gmtime trả về, luôn là 0. Không có Giờ tiết kiệm ánh sáng ban ngày theo GMT.

Bạn nên lưu ý thực tế là localtime () sẽ trả về giờ địa phương hiện tại trên máy chạy script và gmtime () sẽ trả về Giờ trung bình của Greenwich, hoặc GMT (hoặc UTC).

Hãy thử ví dụ sau để in ngày và giờ hiện tại nhưng theo thang GMT -

#!/usr/local/bin/perl

$datestring = gmtime(); print "GMT date and time $datestring\n";

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

GMT date and time Sat Feb 16 13:50:45 2013

Định dạng ngày và giờ

Bạn có thể sử dụng hàm localtime () để nhận danh sách gồm 9 phần tử và sau đó, bạn có thể sử dụng printf() chức năng định dạng ngày và giờ dựa trên yêu cầu của bạn như sau:

#!/usr/local/bin/perl
 
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(); printf("Time Format - HH:MM:SS\n"); printf("%02d:%02d:%02d", $hour, $min, $sec);

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

Time Format - HH:MM:SS
06:58:52

Thời gian kỷ nguyên

Bạn có thể sử dụng hàm time () để lấy thời gian kỷ, tức là số giây đã trôi qua kể từ một ngày nhất định, trong Unix là ngày 1 tháng 1 năm 1970.

#!/usr/local/bin/perl
 
$epoc = time(); print "Number of seconds since Jan 1, 1970 - $epoc\n";

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

Number of seconds since Jan 1, 1970 - 1361022130

Bạn có thể chuyển đổi một số giây nhất định thành chuỗi ngày và giờ như sau:

#!/usr/local/bin/perl

$datestring = localtime(); print "Current date and time $datestring\n";

$epoc = time(); $epoc = $epoc - 24 * 60 * 60; # one day before of current date. $datestring = localtime($epoc); print "Yesterday's date and time $datestring\n";

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

Current date and time Tue Jun  5 05:54:43 2018
Yesterday's date and time Mon Jun  4 05:54:43 2018

Hàm POSIX strftime ()

Bạn có thể sử dụng chức năng POSIX strftime()để định dạng ngày và giờ với sự trợ giúp của bảng sau. Xin lưu ý rằng các thông số được đánh dấu bằng dấu hoa thị (*) phụ thuộc vào ngôn ngữ.

Bộ định danh Được thay thế bởi Thí dụ
%a Tên ngày trong tuần viết tắt * Thu
%A Tên đầy đủ các ngày trong tuần * Thursday
%b Tên tháng viết tắt * Aug
%B Tên tháng đầy đủ * August
%c Biểu diễn ngày và giờ * Thu Aug 23 14:55:02 2001
%C Năm chia cho 100 và cắt ngắn thành số nguyên ( 00-99) 20
%d Ngày trong tháng, không đệm ( 01-31) 23
%D MM/DD/YYNgày ngắn hạn , tương đương với%m/%d/%y 08/23/01
%e Ngày trong tháng, dấu cách ( 1-31) 23
%F YYYY-MM-DDNgày ngắn hạn , tương đương với%Y-%m-%d 2001-08-23
%g Năm dựa trên tuần, hai chữ số cuối cùng ( 00-99) 01
%G Năm dựa trên tuần 2001
%h Tên tháng viết tắt * (giống như %b) Aug
%H Giờ ở định dạng 24h ( 00-23) 14
%I Giờ ở định dạng 12h ( 01-12) 02
%j Ngày trong năm ( 001-366) 235
%m Tháng dưới dạng số thập phân ( 01-12) 08
%M Phút ( 00-59) 55
%n Ký tự dòng mới ( '\n')
%p Chỉ định AM hoặc PM PM
%r Đồng hồ 12 giờ * 02:55:02 pm
%R HH:MMThời gian 24 giờ , tương đương với%H:%M 14:55
%S Thứ hai ( 00-61) 02
%t Ký tự tab ngang ( '\t')
%T Định dạng thời gian ISO 8601 ( HH:MM:SS), tương đương với%H:%M:%S 14:55
%u ISO 8601 ngày trong tuần là số với Thứ Hai là 1( 1-7) 4
%U Số tuần với Chủ nhật đầu tiên là ngày đầu tiên của tuần một ( 00-53) 33
%V ISO 8601 số tuần ( 00-53) 34
%w Ngày trong tuần dưới dạng số thập phân với Chủ nhật là 0( 0-6) 4
%W Số tuần với thứ Hai đầu tiên là ngày đầu tiên của tuần một ( 00-53) 34
%x Biểu diễn ngày * 08/23/01
%X Biểu diễn thời gian * 14:55:02
%y Năm, hai chữ số cuối cùng ( 00-99) 01
%Y Năm 2001
%z

Độ lệch ISO 8601 từ UTC trong múi giờ (1 phút = 1, 1 giờ = 100)

Nếu không thể xác định múi giờ, không có ký tự

+100
%Z

Tên hoặc chữ viết tắt của múi giờ *

Nếu không thể xác định múi giờ, không có ký tự

CDT
%% Một %dấu hiệu %

Hãy xem ví dụ sau để hiểu cách sử dụng -

#!/usr/local/bin/perl
use POSIX qw(strftime);

$datestring = strftime "%a %b %e %H:%M:%S %Y", localtime; printf("date and time - $datestring\n");

# or for GMT formatted appropriately for your locale:
$datestring = strftime "%a %b %e %H:%M:%S %Y", gmtime; printf("date and time - $datestring\n");

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

date and time - Sat Feb 16 07:10:23 2013
date and time - Sat Feb 16 14:10:23 2013

Chương trình con Perl hoặc hàm là một nhóm các câu lệnh cùng thực hiện một nhiệm vụ. Bạn có thể chia mã của mình thành các chương trình con riêng biệt. Cách bạn phân chia mã của mình giữa các chương trình con khác nhau là tùy thuộc vào bạn, nhưng về mặt logic, việc phân chia thường là do mỗi hàm thực hiện một nhiệm vụ cụ thể.

Perl sử dụng các thuật ngữ chương trình con, phương thức và chức năng thay thế cho nhau.

Xác định và gọi một chương trình con

Dạng tổng quát của định nghĩa chương trình con trong ngôn ngữ lập trình Perl như sau:

sub subroutine_name {
   body of the subroutine
}

Cách gọi chương trình con Perl điển hình như sau:

subroutine_name( list of arguments );

Trong các phiên bản của Perl trước 5.0, cú pháp để gọi các chương trình con hơi khác như hình dưới đây. Điều này vẫn hoạt động trong các phiên bản Perl mới nhất, nhưng nó không được khuyến khích vì nó bỏ qua nguyên mẫu chương trình con.

&subroutine_name( list of arguments );

Hãy xem ví dụ sau, nó định nghĩa một hàm đơn giản và sau đó gọi nó. Vì Perl biên dịch chương trình của bạn trước khi thực thi nó, nên việc bạn khai báo chương trình con ở đâu không quan trọng.

#!/usr/bin/perl

# Function definition
sub Hello {
   print "Hello, World!\n";
}

# Function call
Hello();

Khi chương trình trên được thực thi, nó tạo ra kết quả sau:

Hello, World!

Chuyển các đối số đến một chương trình con

Bạn có thể truyền các đối số khác nhau vào một chương trình con giống như bạn làm trong bất kỳ ngôn ngữ lập trình nào khác và chúng có thể được ghi vào bên trong hàm bằng cách sử dụng mảng đặc biệt @_. Do đó, đối số đầu tiên của hàm nằm trong$_[0], the second is in $_ [1], v.v.

Bạn có thể truyền các mảng và hàm băm dưới dạng đối số giống như bất kỳ đại lượng vô hướng nào nhưng việc truyền nhiều hơn một mảng hoặc hàm băm thông thường khiến chúng mất danh tính riêng biệt. Vì vậy, chúng tôi sẽ sử dụng các tham chiếu (được giải thích trong chương tiếp theo) để chuyển bất kỳ mảng hoặc băm nào.

Hãy thử ví dụ sau, lấy một danh sách các số và sau đó in giá trị trung bình của chúng -

#!/usr/bin/perl

# Function definition
sub Average {
   # get total number of arguments passed.
   $n = scalar(@_); $sum = 0;

   foreach $item (@_) { $sum += $item; } $average = $sum / $n;

   print "Average for the given numbers : $average\n";
}

# Function call
Average(10, 20, 30);

Khi chương trình trên được thực thi, nó tạo ra kết quả sau:

Average for the given numbers : 20

Chuyển danh sách đến chương trình con

Vì biến @_ là một mảng nên nó có thể được sử dụng để cung cấp danh sách cho một chương trình con. Tuy nhiên, do cách Perl chấp nhận và phân tích cú pháp các danh sách và mảng, có thể khó trích xuất các phần tử riêng lẻ từ @_. Nếu bạn phải chuyển một danh sách cùng với các đối số vô hướng khác, thì hãy tạo danh sách làm đối số cuối cùng như hình dưới đây:

#!/usr/bin/perl

# Function definition
sub PrintList {
   my @list = @_;
   print "Given list is @list\n";
}
$a = 10;
@b = (1, 2, 3, 4);

# Function call with list parameter
PrintList($a, @b);

Khi chương trình trên được thực thi, nó tạo ra kết quả sau:

Given list is 10 1 2 3 4

Chuyển các hàm băm cho các chương trình con

Khi bạn cung cấp hàm băm cho chương trình con hoặc toán tử chấp nhận một danh sách, thì hàm băm sẽ tự động được dịch thành danh sách các cặp khóa / giá trị. Ví dụ -

#!/usr/bin/perl

# Function definition
sub PrintHash {
   my (%hash) = @_;

   foreach my $key ( keys %hash ) {
      my $value = $hash{$key}; print "$key : $value\n";
   }
}
%hash = ('name' => 'Tom', 'age' => 19);

# Function call with hash parameter
PrintHash(%hash);

Khi chương trình trên được thực thi, nó tạo ra kết quả sau:

name : Tom
age : 19

Trả lại giá trị từ một chương trình con

Bạn có thể trả về một giá trị từ chương trình con giống như bạn làm trong bất kỳ ngôn ngữ lập trình nào khác. Nếu bạn không trả về giá trị từ một chương trình con thì bất kỳ phép tính nào được thực hiện lần cuối trong chương trình con cũng tự động trở thành giá trị trả về.

Bạn có thể trả về mảng và hàm băm từ chương trình con giống như bất kỳ hàm vô hướng nào nhưng việc trả về nhiều hơn một mảng hoặc hàm băm thông thường khiến chúng mất đi các danh tính riêng biệt. Vì vậy, chúng tôi sẽ sử dụng các tham chiếu (được giải thích trong chương tiếp theo) để trả về bất kỳ mảng hoặc băm nào từ một hàm.

Hãy thử ví dụ sau, lấy một danh sách các số và sau đó trả về giá trị trung bình của chúng -

#!/usr/bin/perl

# Function definition
sub Average {
   # get total number of arguments passed.
   $n = scalar(@_);
   $sum = 0; foreach $item (@_) {
      $sum += $item;
   }
   $average = $sum / $n; return $average;
}

# Function call
$num = Average(10, 20, 30); print "Average for the given numbers : $num\n";

Khi chương trình trên được thực thi, nó tạo ra kết quả sau:

Average for the given numbers : 20

Biến riêng trong chương trình con

Theo mặc định, tất cả các biến trong Perl là biến toàn cục, có nghĩa là chúng có thể được truy cập từ bất kỳ đâu trong chương trình. Nhưng bạn có thể tạoprivate các biến được gọi là lexical variables bất cứ lúc nào với my nhà điều hành.

Các mytoán tử giới hạn một biến trong một vùng mã cụ thể mà nó có thể được sử dụng và truy cập. Bên ngoài khu vực đó, biến này không thể được sử dụng hoặc truy cập. Vùng này được gọi là phạm vi của nó. Phạm vi từ vựng thường là một khối mã với một tập hợp các dấu ngoặc nhọn xung quanh nó, chẳng hạn như các dấu ngoặc nhọn xác định phần thân của chương trình con hoặc các khối mã đánh dấu các khối mã của các câu lệnh if, while, for, foreacheval .

Sau đây là một ví dụ cho bạn thấy cách xác định một hoặc nhiều biến riêng bằng cách sử dụng my nhà điều hành -

sub somefunc {
   my $variable; # $variable is invisible outside somefunc()
   my ($another, @an_array, %a_hash); # declaring many variables at once
}

Hãy kiểm tra ví dụ sau để phân biệt giữa biến toàn cục và biến riêng:

#!/usr/bin/perl

# Global variable
$string = "Hello, World!";

# Function definition
sub PrintHello {
   # Private variable for PrintHello function
   my $string; $string = "Hello, Perl!";
   print "Inside the function $string\n"; } # Function call PrintHello(); print "Outside the function $string\n";

Khi chương trình trên được thực thi, nó tạo ra kết quả sau:

Inside the function Hello, Perl!
Outside the function Hello, World!

Giá trị tạm thời qua cục bộ ()

Các localchủ yếu được sử dụng khi giá trị hiện tại của một biến phải được hiển thị cho các chương trình con được gọi. Local chỉ cung cấp các giá trị tạm thời cho các biến toàn cục (nghĩa là gói). Đây được gọi là phạm vi động . Lexical scoping được thực hiện với my, hoạt động giống như khai báo tự động của C.

Nếu nhiều biến hoặc biểu thức được cấp cho cục bộ, chúng phải được đặt trong dấu ngoặc đơn. Toán tử này hoạt động bằng cách lưu các giá trị hiện tại của các biến đó trong danh sách đối số của nó trên một ngăn xếp ẩn và khôi phục chúng khi thoát khỏi khối, chương trình con hoặc eval.

Hãy kiểm tra ví dụ sau để phân biệt giữa các biến toàn cục và cục bộ:

#!/usr/bin/perl

# Global variable
$string = "Hello, World!"; sub PrintHello { # Private variable for PrintHello function local $string;
   $string = "Hello, Perl!"; PrintMe(); print "Inside the function PrintHello $string\n";
}
sub PrintMe {
   print "Inside the function PrintMe $string\n"; } # Function call PrintHello(); print "Outside the function $string\n";

Khi chương trình trên được thực thi, nó tạo ra kết quả sau:

Inside the function PrintMe Hello, Perl!
Inside the function PrintHello Hello, Perl!
Outside the function Hello, World!

Biến trạng thái qua trạng thái ()

Có một loại biến từ vựng khác, tương tự như biến private nhưng chúng duy trì trạng thái của chúng và chúng không được khởi động lại khi có nhiều lệnh gọi của các chương trình con. Các biến này được xác định bằng cách sử dụngstate và có sẵn bắt đầu từ Perl 5.9.4.

Hãy xem ví dụ sau để chứng minh việc sử dụng state biến -

#!/usr/bin/perl

use feature 'state';

sub PrintCount {
   state $count = 0; # initial value print "Value of counter is $count\n";
   $count++;
}

for (1..5) {
   PrintCount();
}

Khi chương trình trên được thực thi, nó tạo ra kết quả sau:

Value of counter is 0
Value of counter is 1
Value of counter is 2
Value of counter is 3
Value of counter is 4

Trước Perl 5.10, bạn sẽ phải viết nó như thế này -

#!/usr/bin/perl

{
   my $count = 0; # initial value

   sub PrintCount {
      print "Value of counter is $count\n"; $count++;
   }
}

for (1..5) {
   PrintCount();
}

Ngữ cảnh cuộc gọi chương trình con

Ngữ cảnh của chương trình con hoặc câu lệnh được định nghĩa là kiểu giá trị trả về được mong đợi. Điều này cho phép bạn sử dụng một hàm duy nhất trả về các giá trị khác nhau dựa trên những gì người dùng mong đợi nhận được. Ví dụ: localtime () sau đây trả về một chuỗi khi nó được gọi trong ngữ cảnh vô hướng, nhưng nó trả về một danh sách khi nó được gọi trong ngữ cảnh danh sách.

my $datestring = localtime( time );

Trong ví dụ này, giá trị của $ timestr hiện là một chuỗi được tạo thành từ ngày và giờ hiện tại, ví dụ: Thứ Năm, ngày 30 tháng 11 15:21:33 năm 2000. Ngược lại -

($sec,$min,$hour,$mday,$mon, $year,$wday,$yday,$isdst) = localtime(time);

Bây giờ các biến riêng lẻ chứa các giá trị tương ứng được trả về bởi chương trình con localtime ().

Tham chiếu Perl là kiểu dữ liệu vô hướng giữ vị trí của một giá trị khác có thể là vô hướng, mảng hoặc hàm băm. Vì tính chất vô hướng của nó, một tham chiếu có thể được sử dụng ở bất cứ đâu, một đại lượng vô hướng có thể được sử dụng.

Bạn có thể tạo danh sách chứa các tham chiếu đến các danh sách khác, danh sách này có thể chứa các tham chiếu đến hàm băm, v.v. Đây là cách các cấu trúc dữ liệu lồng nhau được xây dựng trong Perl.

Tạo tài liệu tham khảo

Dễ dàng tạo tham chiếu cho bất kỳ biến, chương trình con hoặc giá trị nào bằng cách đặt trước nó bằng dấu gạch chéo ngược như sau:

$scalarref = \$foo; $arrayref  = \@ARGV;
$hashref = \%ENV; $coderef   = \&handler;
$globref   = \*foo;

Bạn không thể tạo tham chiếu trên một xử lý I / O (xử lý tệp hoặc xử lý dirhandle) bằng cách sử dụng toán tử dấu gạch chéo ngược nhưng tham chiếu đến một mảng ẩn danh có thể được tạo bằng cách sử dụng dấu ngoặc vuông như sau:

$arrayref = [1, 2, ['a', 'b', 'c']];

Theo cách tương tự, bạn có thể tạo tham chiếu đến hàm băm ẩn danh bằng cách sử dụng dấu ngoặc nhọn như sau:

$hashref = {
   'Adam'  => 'Eve',
   'Clyde' => 'Bonnie',
};

Tham chiếu đến một chương trình con ẩn danh có thể được tạo bằng cách sử dụng sub không có tên phụ như sau:

$coderef = sub { print "Boink!\n" };

Tham khảo

Tham chiếu trả về giá trị từ một điểm tham chiếu đến vị trí. Để bỏ qua một tham chiếu, chỉ cần sử dụng $, @ hoặc% làm tiền tố của biến tham chiếu tùy thuộc vào việc tham chiếu có trỏ đến một vô hướng, mảng hay hàm băm hay không. Sau đây là ví dụ để giải thích khái niệm -

#!/usr/bin/perl

$var = 10;

# Now $r has reference to $var scalar.
$r = \$var;

# Print value available at the location stored in $r. print "Value of $var is : ", $$r, "\n"; @var = (1, 2, 3); # Now $r has reference to @var array.
$r = \@var; # Print values available at the location stored in $r.
print "Value of @var is : ",  @$r, "\n"; %var = ('key1' => 10, 'key2' => 20); # Now $r has reference to %var hash.
$r = \%var; # Print values available at the location stored in $r.
print "Value of %var is : ", %$r, "\n";

Khi chương trình trên được thực thi, nó tạo ra kết quả sau:

Value of 10 is : 10
Value of 1 2 3 is : 123
Value of %var is : key220key110

Nếu bạn không chắc chắn về một kiểu biến, thì thật dễ dàng để biết kiểu của nó bằng cách sử dụng ref, trả về một trong các chuỗi sau nếu đối số của nó là tham chiếu. Nếu không, nó trả về false -

SCALAR
ARRAY
HASH
CODE
GLOB
REF

Hãy thử ví dụ sau:

#!/usr/bin/perl

$var = 10;
$r = \$var;
print "Reference type in r : ", ref($r), "\n"; @var = (1, 2, 3); $r = \@var;
print "Reference type in r : ", ref($r), "\n"; %var = ('key1' => 10, 'key2' => 20); $r = \%var;
print "Reference type in r : ", ref($r), "\n";

Khi chương trình trên được thực thi, nó tạo ra kết quả sau:

Reference type in r : SCALAR
Reference type in r : ARRAY
Reference type in r : HASH

Tham chiếu vòng tròn

Tham chiếu vòng tròn xảy ra khi hai tham chiếu chứa tham chiếu đến nhau. Bạn phải cẩn thận trong khi tạo tham chiếu nếu không tham chiếu vòng có thể dẫn đến rò rỉ bộ nhớ. Sau đây là một ví dụ -

#!/usr/bin/perl

 my $foo = 100;
 $foo = \$foo;
 
 print "Value of foo is : ", $$foo, "\n";

Khi chương trình trên được thực thi, nó tạo ra kết quả sau:

Value of foo is : REF(0x9aae38)

Tham chiếu đến các hàm

Điều này có thể xảy ra nếu bạn cần tạo một trình xử lý tín hiệu để bạn có thể tạo một tham chiếu đến một hàm bằng cách đặt trước tên hàm đó bằng \ & và để hủy bỏ tham chiếu đó, bạn chỉ cần đặt trước biến tham chiếu bằng cách sử dụng ký hiệu và &. Sau đây là một ví dụ -

#!/usr/bin/perl

# Function definition
sub PrintHash {
   my (%hash) = @_;
   
   foreach $item (%hash) {
      print "Item : $item\n"; } } %hash = ('name' => 'Tom', 'age' => 19); # Create a reference to above function. $cref = \&PrintHash;

# Function call using reference.
&$cref(%hash);

Khi chương trình trên được thực thi, nó tạo ra kết quả sau:

Item : name
Item : Tom
Item : age
Item : 19

Perl sử dụng một mẫu viết được gọi là 'định dạng' để xuất báo cáo. Để sử dụng tính năng định dạng của Perl, trước tiên bạn phải xác định một định dạng và sau đó bạn có thể sử dụng định dạng đó để ghi dữ liệu được định dạng.

Xác định một định dạng

Sau đây là cú pháp để xác định định dạng Perl:

format FormatName =
fieldline
value_one, value_two, value_three
fieldline
value_one, value_two
.

Đây FormatNameđại diện cho tên của định dạng. Cácfieldlinelà cách cụ thể, dữ liệu nên được định dạng. Các dòng giá trị đại diện cho các giá trị sẽ được nhập vào dòng trường. Bạn kết thúc định dạng bằng một dấu chấm.

Kế tiếp fieldlinecó thể chứa bất kỳ văn bản hoặc trình giữ trường nào. Các trường giữ chỗ cho dữ liệu sẽ được đặt ở đó vào một ngày sau đó. Một trường có định dạng -

@<<<<

Trường giữ nguyên này được căn trái, với khoảng trống trường là 5. Bạn phải đếm dấu @ và dấu <để biết số lượng khoảng trắng trong trường. Những người nắm giữ lĩnh vực khác bao gồm -

@>>>> right-justified
@|||| centered
@####.## numeric field holder
@* multiline field holder

Một định dạng ví dụ sẽ là -

format EMPLOYEE =
===================================
@<<<<<<<<<<<<<<<<<<<<<< @<< 
$name $age @#####.## $salary
===================================
.

Trong ví dụ này, $ name sẽ được viết là căn trái trong khoảng cách 22 ký tự và sau độ tuổi đó sẽ được viết trong hai khoảng trắng.

Sử dụng Định dạng

Để gọi khai báo định dạng này, chúng tôi sẽ sử dụng write từ khóa -

write EMPLOYEE;

Vấn đề là tên định dạng thường là tên của một xử lý tệp đang mở và câu lệnh write sẽ gửi kết quả đến xử lý tệp này. Vì chúng ta muốn dữ liệu được gửi đến STDOUT, chúng ta phải kết hợp EMPLOYEE với bộ xử lý tệp STDOUT. Tuy nhiên, trước tiên, chúng ta phải đảm bảo rằng STDOUT là tệp xử lý đã chọn của chúng ta, bằng cách sử dụng hàm select ().

select(STDOUT);

Sau đó, chúng tôi sẽ liên kết EMPLOYEE với STDOUT bằng cách đặt tên định dạng mới với STDOUT, sử dụng biến đặc biệt $ ~ hoặc $ FORMAT_NAME như sau:

$~ = "EMPLOYEE";

Khi bây giờ chúng ta thực hiện write (), dữ liệu sẽ được gửi đến STDOUT. Hãy nhớ rằng: nếu bạn định viết báo cáo của mình trong bất kỳ trình xử lý tệp nào khác thay vì STDOUT thì bạn có thể sử dụng hàm select () để chọn xử lý tệp đó và phần còn lại của logic sẽ giữ nguyên.

Hãy lấy ví dụ sau. Ở đây chúng tôi có các giá trị được mã hóa cứng chỉ để hiển thị cách sử dụng. Trong cách sử dụng thực tế, bạn sẽ đọc các giá trị từ tệp hoặc cơ sở dữ liệu để tạo báo cáo thực tế và bạn có thể cần viết lại báo cáo cuối cùng vào tệp.

#!/usr/bin/perl

format EMPLOYEE =
===================================
@<<<<<<<<<<<<<<<<<<<<<< @<< 
$name $age
@#####.##
$salary =================================== . select(STDOUT); $~ = EMPLOYEE;

@n = ("Ali", "Raza", "Jaffer");
@a  = (20,30, 40);
@s = (2000.00, 2500.00, 4000.000);

$i = 0; foreach (@n) { $name = $_; $age = $a[$i];
   $salary = $s[$i++];
   write;
}

Khi được thực thi, điều này sẽ tạo ra kết quả sau:

===================================
Ali                     20
  2000.00
===================================
===================================
Raza                    30
  2500.00
===================================
===================================
Jaffer                  40
  4000.00
===================================

Xác định Tiêu đề Báo cáo

Mọi thứ có vẻ ổn. Nhưng bạn sẽ quan tâm đến việc thêm tiêu đề vào báo cáo của mình. Tiêu đề này sẽ được in trên đầu mỗi trang. Nó rất đơn giản để làm điều này. Ngoài việc xác định mẫu, bạn sẽ phải xác định tiêu đề và gán nó cho biến $ ^ hoặc $ FORMAT_TOP_NAME -

#!/usr/bin/perl

format EMPLOYEE =
===================================
@<<<<<<<<<<<<<<<<<<<<<< @<< 
$name $age @#####.## $salary
===================================
.

format EMPLOYEE_TOP =
===================================
Name                    Age
===================================
.

select(STDOUT);
$~ = EMPLOYEE; $^ = EMPLOYEE_TOP;

@n = ("Ali", "Raza", "Jaffer");
@a  = (20,30, 40);
@s = (2000.00, 2500.00, 4000.000);

$i = 0; foreach (@n) { $name = $_; $age = $a[$i];
   $salary = $s[$i++];
   write;
}

Bây giờ báo cáo của bạn sẽ giống như -

===================================
Name                    Age
===================================
===================================
Ali                     20
  2000.00
===================================
===================================
Raza                    30
  2500.00
===================================
===================================
Jaffer                  40
  4000.00
===================================

Xác định phân trang

Còn nếu báo cáo của bạn chiếm nhiều hơn một trang thì sao? Bạn có một giải pháp cho điều đó, chỉ cần sử dụng$% hoặc $ FORMAT_PAGE_NUMBER có thể chạy được cùng với tiêu đề như sau -

format EMPLOYEE_TOP =
===================================
Name                    Age Page @<
                                 $%
===================================                               
.

Bây giờ đầu ra của bạn sẽ giống như sau:

===================================
Name                    Age Page 1
===================================
===================================
Ali                     20
  2000.00
===================================
===================================
Raza                    30
  2500.00
===================================
===================================
Jaffer                  40
  4000.00
===================================

Số dòng trên một trang

Bạn có thể đặt số dòng trên mỗi trang bằng cách sử dụng biến đặc biệt $= (hoặc $ FORMAT_LINES_PER_PAGE), Theo mặc định $ = sẽ là 60.

Xác định Chân trang Báo cáo

Trong khi $ ^ hoặc $FORMAT_TOP_NAME contains the name of the current header format, there is no corresponding mechanism to automatically do the same thing for a footer. If you have a fixed-size footer, you can get footers by checking variable $- hoặc $ FORMAT_LINES_LEFT trước mỗi lần write () và tự in phần chân trang nếu cần bằng cách sử dụng định dạng khác được xác định như sau -

format EMPLOYEE_BOTTOM =
End of Page @<
            $%
.

Để có tập hợp đầy đủ các biến liên quan đến việc định dạng, vui lòng tham khảo phần Biến Đặc biệt Perl .

Những điều cơ bản về xử lý tệp rất đơn giản: bạn liên kết filehandle với một thực thể bên ngoài (thường là tệp) và sau đó sử dụng nhiều toán tử và chức năng trong Perl để đọc và cập nhật dữ liệu được lưu trữ trong luồng dữ liệu được liên kết với xử lý tệp.

Xử lý tệp là một cấu trúc Perl nội bộ được đặt tên liên kết tệp vật lý với một tên. Tất cả các bộ xử lý tệp đều có khả năng truy cập đọc / ghi, vì vậy bạn có thể đọc và cập nhật bất kỳ tệp hoặc thiết bị nào được liên kết với một bộ xử lý tệp. Tuy nhiên, khi bạn kết hợp một xử lý tệp, bạn có thể chỉ định chế độ mà xử lý tệp được mở.

Ba trình xử lý tệp cơ bản là - STDIN, STDOUTSTDERR, đại diện cho đầu vào tiêu chuẩn, đầu ra tiêu chuẩn và thiết bị lỗi tiêu chuẩn tương ứng.

Mở và đóng tệp

Có hai hàm sau với nhiều biểu mẫu, có thể được sử dụng để mở bất kỳ tệp mới hoặc hiện có nào trong Perl.

open FILEHANDLE, EXPR
open FILEHANDLE

sysopen FILEHANDLE, FILENAME, MODE, PERMS
sysopen FILEHANDLE, FILENAME, MODE

Ở đây FILEHANDLE là trình xử lý tệp được trả về bởi open hàm và EXPR là biểu thức có tên tệp và chế độ mở tệp.

Mở chức năng

Sau đây là cú pháp để mở file.txtở chế độ chỉ đọc. Ở đây dấu <<chỉ ra rằng tệp phải được mở ở chế độ chỉ đọc.

open(DATA, "<file.txt");

Ở đây DATA là trình xử lý tệp, sẽ được sử dụng để đọc tệp. Đây là ví dụ, sẽ mở một tệp và sẽ in nội dung của nó ra màn hình.

#!/usr/bin/perl

open(DATA, "<file.txt") or die "Couldn't open file file.txt, $!"; while(<DATA>) { print "$_";
}

Sau đây là cú pháp để mở file.txt ở chế độ ghi. Ở đây dấu nhỏ hơn> chỉ ra rằng tệp phải được mở ở chế độ ghi.

open(DATA, ">file.txt") or die "Couldn't open file file.txt, $!";

Ví dụ này thực sự cắt bớt (làm trống) tệp trước khi mở để viết, điều này có thể không mang lại hiệu quả mong muốn. Nếu bạn muốn mở một tệp để đọc và viết, bạn có thể đặt một dấu cộng trước các ký tự> hoặc <.

Ví dụ: để mở một tệp để cập nhật mà không cắt ngắn nó -

open(DATA, "+<file.txt"); or die "Couldn't open file file.txt, $!";

Để cắt ngắn tệp trước tiên -

open DATA, "+>file.txt" or die "Couldn't open file file.txt, $!";

Bạn có thể mở tệp ở chế độ nối thêm. Trong chế độ này, điểm ghi sẽ được đặt ở cuối tệp.

open(DATA,">>file.txt") || die "Couldn't open file file.txt, $!";

Dấu đúp >> mở tệp để bổ sung, đặt con trỏ tệp ở cuối, để bạn có thể bắt đầu ngay lập tức thông tin bổ sung. Tuy nhiên, bạn không thể đọc từ nó trừ khi bạn cũng đặt một dấu cộng trước nó -

open(DATA,"+>>file.txt") || die "Couldn't open file file.txt, $!";

Sau đây là bảng, cung cấp các giá trị có thể có của các chế độ khác nhau

Sr.No. Thực thể & Định nghĩa
1

< or r

Quyền truy cập chỉ đọc

2

> or w

Sáng tạo, Viết và Cắt bớt

3

>> or a

Viết, bổ sung và sáng tạo

4

+< or r+

Đọc và Viết

5

+> or w+

Đọc, Viết, Sáng tạo và Cắt bớt

6

+>> or a+

Đọc, Viết, Thêm và Sáng tạo

Chức năng Sysopen

Các sysopen chức năng tương tự như chức năng mở chính, ngoại trừ việc nó sử dụng hệ thống open() chức năng, sử dụng các tham số được cung cấp cho nó làm tham số cho chức năng hệ thống -

Ví dụ: để mở một tệp để cập nhật, mô phỏng +<filename định dạng từ mở -

sysopen(DATA, "file.txt", O_RDWR);

Hoặc cắt bớt tệp trước khi cập nhật -

sysopen(DATA, "file.txt", O_RDWR|O_TRUNC );

Bạn có thể sử dụng O_CREAT để tạo tệp mới và O_WRONLY- để mở tệp ở chế độ chỉ ghi và O_RDONLY - để mở tệp ở chế độ chỉ đọc.

Các PERMSđối số chỉ định các quyền đối với tệp được chỉ định, nếu tệp đó phải được tạo. Theo mặc định, nó mất0x666.

Sau đây là bảng, cung cấp các giá trị có thể có của MODE.

Sr.No. Thực thể & Định nghĩa
1

O_RDWR

Đọc và viết

2

O_RDONLY

Chỉ đọc

3

O_WRONLY

Chỉ viết

4

O_CREAT

Tạo tệp

5

O_APPEND

Nối tệp

6

O_TRUNC

Cắt bớt tệp

7

O_EXCL

Dừng nếu tệp đã tồn tại

số 8

O_NONBLOCK

Khả năng sử dụng không chặn

Đóng chức năng

Để đóng một trình xử lý tệp, và do đó ngắt kết nối xử lý tệp khỏi tệp tương ứng, bạn sử dụng closechức năng. Thao tác này xóa bộ đệm của bộ xử lý tệp và đóng bộ mô tả tệp của hệ thống.

close FILEHANDLE
close

Nếu không có FILEHANDLE nào được chỉ định, thì nó sẽ đóng xử lý tệp hiện đang được chọn. Nó chỉ trả về true nếu nó có thể xóa thành công bộ đệm và đóng tệp.

close(DATA) || die "Couldn't close file properly";

Đọc và ghi tệp

Khi bạn đã có một bộ xử lý tệp mở, bạn cần có khả năng đọc và ghi thông tin. Có một số cách khác nhau để đọc và ghi dữ liệu vào tệp.

Toán tử <FILEHANDL>

Phương pháp chính để đọc thông tin từ một trình xử lý tệp đang mở là toán tử <FILEHANDLE>. Trong ngữ cảnh vô hướng, nó trả về một dòng duy nhất từ ​​tệp xử lý. Ví dụ -

#!/usr/bin/perl

print "What is your name?\n";
$name = <STDIN>;
print "Hello $name\n";

Khi bạn sử dụng toán tử <FILEHANDLE> trong ngữ cảnh danh sách, nó trả về danh sách các dòng từ xử lý tệp được chỉ định. Ví dụ, để nhập tất cả các dòng từ một tệp vào một mảng -

#!/usr/bin/perl

open(DATA,"<import.txt") or die "Can't open data";
@lines = <DATA>;
close(DATA);

Hàm getc

Hàm getc trả về một ký tự đơn từ FILEHANDLE hoặc STDIN được chỉ định nếu không có ký tự nào được chỉ định -

getc FILEHANDLE
getc

Nếu có lỗi hoặc tệp xử lý ở cuối tệp, thì thay vào đó, undef sẽ được trả về.

đọc Chức năng

Hàm read đọc một khối thông tin từ xử lý tệp được đệm: Hàm này được sử dụng để đọc dữ liệu nhị phân từ tệp.

read FILEHANDLE, SCALAR, LENGTH, OFFSET
read FILEHANDLE, SCALAR, LENGTH

Độ dài của dữ liệu đọc được xác định bởi LENGTH và dữ liệu được đặt ở đầu SCALAR nếu không có OFFSET được chỉ định. Nếu không, dữ liệu được đặt sau byte OFFSET trong SCALAR. Hàm trả về số byte được đọc khi thành công, số không ở cuối tệp hoặc hoàn tác nếu có lỗi.

chức năng in

Đối với tất cả các phương pháp khác nhau được sử dụng để đọc thông tin từ các bộ xử lý tệp, chức năng chính để ghi lại thông tin là chức năng in.

print FILEHANDLE LIST
print LIST
print

Chức năng in sẽ in giá trị được đánh giá của LIST tới FILEHANDLE, hoặc tới bộ xử lý tệp đầu ra hiện tại (STDOUT theo mặc định). Ví dụ -

print "Hello World!\n";

Sao chép các tập tin

Đây là ví dụ, mở một tệp hiện có file1.txt và đọc từng dòng một và tạo một bản sao tệp khác file2.txt.

#!/usr/bin/perl

# Open file to read
open(DATA1, "<file1.txt");

# Open new file to write
open(DATA2, ">file2.txt");

# Copy data from one file to another.
while(<DATA1>) {
   print DATA2 $_;
}
close( DATA1 );
close( DATA2 );

Đổi tên tệp

Đây là một ví dụ cho thấy cách chúng ta có thể đổi tên tệp file1.txt thành file2.txt. Giả sử tệp có sẵn trong thư mục / usr / test.

#!/usr/bin/perl

rename ("/usr/test/file1.txt", "/usr/test/file2.txt" );

Chức năng này renames nhận hai đối số và nó chỉ đổi tên tệp hiện có.

Xóa một tệp hiện có

Đây là một ví dụ cho thấy cách xóa tệp file1.txt bằng cách sử dụng unlink chức năng.

#!/usr/bin/perl

unlink ("/usr/test/file1.txt");

Định vị bên trong tệp

Bạn có thể sử dụng để tell chức năng để biết vị trí hiện tại của tệp và seek hàm để trỏ đến một vị trí cụ thể bên trong tệp.

nói với chức năng

Yêu cầu đầu tiên là tìm vị trí của bạn trong một tệp, bạn thực hiện việc này bằng cách sử dụng hàm cho biết -

tell FILEHANDLE
tell

Điều này trả về vị trí của con trỏ tệp, tính bằng byte, trong FILEHANDLE nếu được chỉ định hoặc xử lý tệp được chọn mặc định hiện tại nếu không có tệp nào được chỉ định.

Tìm kiếm chức năng

Hàm tìm kiếm định vị con trỏ tệp đến số byte được chỉ định trong tệp -

seek FILEHANDLE, POSITION, WHENCE

Hàm này sử dụng hàm hệ thống fseek, và bạn có cùng khả năng xác định vị trí liên quan đến ba điểm khác nhau: điểm đầu, điểm cuối và vị trí hiện tại. Bạn thực hiện việc này bằng cách chỉ định một giá trị cho WHENCE.

Số không thiết lập vị trí liên quan đến đầu tệp. Ví dụ: dòng đặt con trỏ tệp thành byte thứ 256 trong tệp.

seek DATA, 256, 0;

Thông tin tệp

Bạn có thể kiểm tra một số tính năng nhất định rất nhanh trong Perl bằng cách sử dụng một loạt các toán tử kiểm tra được gọi chung là -X test. Ví dụ: để thực hiện kiểm tra nhanh các quyền khác nhau trên một tệp, bạn có thể sử dụng một tập lệnh như sau -

#/usr/bin/perl

my $file = "/usr/test/file1.txt"; my (@description, $size);
if (-e $file) { push @description, 'binary' if (-B _); push @description, 'a socket' if (-S _); push @description, 'a text file' if (-T _); push @description, 'a block special file' if (-b _); push @description, 'a character special file' if (-c _); push @description, 'a directory' if (-d _); push @description, 'executable' if (-x _); push @description, (($size = -s _)) ? "$size bytes" : 'empty'; print "$file is ", join(', ',@description),"\n";
}

Đây là danh sách các tính năng mà bạn có thể kiểm tra tệp hoặc thư mục -

Sr.No. Toán tử & Định nghĩa
1

-A

Thời gian bắt đầu tập lệnh trừ thời gian truy cập tệp cuối cùng, tính bằng ngày.

2

-B

Nó có phải là một tệp nhị phân không?

3

-C

Thời gian bắt đầu tập lệnh trừ thời gian thay đổi inode cuối cùng của tệp, tính bằng ngày.

3

-M

Thời gian bắt đầu tập lệnh trừ thời gian sửa đổi tệp, tính bằng ngày.

4

-O

Tệp có thuộc sở hữu của ID người dùng thực không?

5

-R

Tệp có thể đọc được bởi ID người dùng thực hay nhóm thực không?

6

-S

Tệp có phải là ổ cắm không?

7

-T

Nó là một tập tin văn bản?

số 8

-W

Tệp có thể ghi bởi ID người dùng thực hay nhóm thực?

9

-X

Tệp được thực thi bởi ID người dùng thực hay nhóm thực?

10

-b

Nó có phải là một tập tin đặc biệt không?

11

-c

Nó có phải là một tập tin đặc biệt không?

12

-d

Tệp có phải là một thư mục không?

13

-e

Tệp có tồn tại không?

14

-f

Nó là một tập tin đơn giản?

15

-g

Tệp có đặt bit setgid không?

16

-k

Tệp có tập hợp bit dính không?

17

-l

Tệp có phải là một liên kết tượng trưng không?

18

-o

Tệp có thuộc sở hữu của ID người dùng hiệu quả không?

19

-p

Tệp có phải là một đường ống được đặt tên không?

20

-r

Tệp có thể đọc được bởi người dùng hoặc ID nhóm hiệu quả không?

21

-s

Trả về kích thước của tệp, kích thước không = tệp trống.

22

-t

Xử lý tệp có được mở bằng TTY (thiết bị đầu cuối) không?

23

-u

Tệp có đặt bit setuid không?

24

-w

Tệp có thể ghi bởi người dùng hoặc ID nhóm hiệu quả không?

25

-x

Tệp có được thực thi bởi người dùng hoặc ID nhóm hiệu quả không?

26

-z

Kích thước tệp là 0?

Sau đây là các hàm tiêu chuẩn được sử dụng để chơi với các thư mục.

opendir DIRHANDLE, EXPR  # To open a directory
readdir DIRHANDLE        # To read a directory
rewinddir DIRHANDLE      # Positioning pointer to the begining
telldir DIRHANDLE        # Returns current position of the dir
seekdir DIRHANDLE, POS   # Pointing pointer to POS inside dir
closedir DIRHANDLE       # Closing a directory.

Hiển thị tất cả các tệp

Có nhiều cách khác nhau để liệt kê tất cả các tệp có sẵn trong một thư mục cụ thể. Trước tiên, hãy sử dụng cách đơn giản để lấy và liệt kê tất cả các tệp bằng cách sử dụngglob nhà điều hành -

#!/usr/bin/perl

# Display all the files in /tmp directory.
$dir = "/tmp/*"; my @files = glob( $dir );

foreach (@files ) {
   print $_ . "\n"; } # Display all the C source files in /tmp directory. $dir = "/tmp/*.c";
@files = glob( $dir ); foreach (@files ) { print $_ . "\n";
}

# Display all the hidden files.
$dir = "/tmp/.*"; @files = glob( $dir );
foreach (@files ) {
   print $_ . "\n"; } # Display all the files from /tmp and /home directories. $dir = "/tmp/* /home/*";
@files = glob( $dir ); foreach (@files ) { print $_ . "\n";
}

Đây là một ví dụ khác, mở một thư mục và liệt kê tất cả các tệp có sẵn bên trong thư mục này.

#!/usr/bin/perl

opendir (DIR, '.') or die "Couldn't open directory, $!"; while ($file = readdir DIR) {
   print "$file\n";
}
closedir DIR;

Một ví dụ khác để in danh sách các tệp nguồn C mà bạn có thể sử dụng là:

#!/usr/bin/perl

opendir(DIR, '.') or die "Couldn't open directory, $!";
foreach (sort grep(/^.*\.c$/,readdir(DIR))) { print "$_\n";
}
closedir DIR;

Tạo thư mục mới

Bạn có thể dùng mkdirchức năng tạo một thư mục mới. Bạn sẽ cần có quyền cần thiết để tạo một thư mục.

#!/usr/bin/perl

$dir = "/tmp/perl"; # This creates perl directory in /tmp directory. mkdir( $dir ) or die "Couldn't create $dir directory, $!";
print "Directory created successfully\n";

Xóa một thư mục

Bạn có thể dùng rmdirchức năng xóa một thư mục. Bạn sẽ cần có quyền cần thiết để xóa một thư mục. Ngoài ra, thư mục này phải trống trước khi bạn cố gắng xóa nó.

#!/usr/bin/perl

$dir = "/tmp/perl"; # This removes perl directory from /tmp directory. rmdir( $dir ) or die "Couldn't remove $dir directory, $!";
print "Directory removed successfully\n";

Thay đổi thư mục

Bạn có thể dùng chdirchức năng thay đổi thư mục và chuyển đến vị trí mới. Bạn sẽ cần có quyền cần thiết để thay đổi thư mục và vào bên trong thư mục mới.

#!/usr/bin/perl

$dir = "/home"; # This changes perl directory and moves you inside /home directory. chdir( $dir ) or die "Couldn't go inside $dir directory, $!";
print "Your new location is $dir\n";

Việc thực thi và các lỗi luôn đi cùng nhau. Nếu bạn đang mở một tệp không tồn tại. thì nếu bạn không xử lý tình huống này đúng cách thì chương trình của bạn được coi là có chất lượng kém.

Chương trình dừng nếu xảy ra lỗi. Vì vậy, một xử lý lỗi thích hợp được sử dụng để xử lý các loại lỗi khác nhau, có thể xảy ra trong quá trình thực thi chương trình và thực hiện hành động thích hợp thay vì dừng chương trình hoàn toàn.

Bạn có thể xác định và mắc lỗi theo một số cách khác nhau. Nó rất dễ mắc lỗi trong Perl và sau đó xử lý chúng đúng cách. Dưới đây là một số phương pháp có thể được sử dụng.

Câu lệnh if

Các if statementlà lựa chọn hiển nhiên khi bạn cần kiểm tra giá trị trả về từ một câu lệnh; ví dụ -

if(open(DATA, $file)) {
   ...
} else {
   die "Error: Couldn't open the file - $!";
}

Đây là biến $! trả về thông báo lỗi thực tế. Ngoài ra, chúng ta có thể giảm câu lệnh xuống một dòng trong các tình huống mà việc làm như vậy là hợp lý; ví dụ -

open(DATA, $file) || die "Error: Couldn't open the file $!";

Chức năng trừ khi

Các unlesshàm ngược lại logic với câu lệnh if: hoàn toàn có thể bỏ qua trạng thái thành công và chỉ được thực thi nếu biểu thức trả về false. Ví dụ -

unless(chdir("/etc")) {
   die "Error: Can't change directory - $!";
}

Các unlesscâu lệnh được sử dụng tốt nhất khi bạn chỉ muốn nêu ra lỗi hoặc thay thế nếu biểu thức không thành công. Câu lệnh cũng có ý nghĩa khi được sử dụng trong câu lệnh một dòng -

die "Error: Can't change directory!: $!" unless(chdir("/etc"));

Ở đây chúng ta chỉ chết nếu thao tác chdir không thành công và nó đọc tốt.

Toán tử bậc ba

Đối với các bài kiểm tra rất ngắn, bạn có thể sử dụng toán tử điều kiện ?:

print(exists($hash{value}) ? 'There' : 'Missing',"\n");

Ở đây không quá rõ ràng những gì chúng tôi đang cố gắng đạt được, nhưng hiệu quả giống như việc sử dụng if hoặc là unlesstuyên bố. Toán tử điều kiện được sử dụng tốt nhất khi bạn muốn nhanh chóng trả về một trong hai giá trị trong một biểu thức hoặc câu lệnh.

Chức năng cảnh báo

Chức năng cảnh báo chỉ đưa ra cảnh báo, một thông báo được in ra STDERR, nhưng không có hành động nào khác được thực hiện. Vì vậy, sẽ hữu ích hơn nếu bạn chỉ muốn in cảnh báo cho người dùng và tiếp tục phần còn lại của hoạt động -

chdir('/etc') or warn "Can't change directory";

Hàm chết

Hàm die hoạt động giống như cảnh báo, ngoại trừ nó cũng gọi là thoát. Trong một script bình thường, hàm này có tác dụng chấm dứt thực thi ngay lập tức. Bạn nên sử dụng chức năng này trong trường hợp không thể tiếp tục nếu có lỗi trong chương trình -

chdir('/etc') or die "Can't change directory";

Lỗi trong Mô-đun

Có hai tình huống khác nhau mà chúng ta có thể xử lý -

  • Báo cáo lỗi trong mô-đun trích dẫn tên tệp và số dòng của mô-đun - điều này hữu ích khi gỡ lỗi mô-đun hoặc khi bạn muốn đặc biệt tạo ra một lỗi liên quan đến mô-đun, thay vì liên quan đến tập lệnh.

  • Báo cáo lỗi trong mô-đun trích dẫn thông tin của người gọi để bạn có thể gỡ lỗi dòng trong tập lệnh gây ra lỗi. Các lỗi được nêu ra theo kiểu này rất hữu ích cho người dùng cuối, vì chúng làm nổi bật lỗi liên quan đến dòng gốc của tập lệnh gọi.

Các warndiecác hàm hoạt động hơi khác so với bạn mong đợi khi được gọi từ bên trong một mô-đun. Ví dụ, mô-đun đơn giản -

package T;

require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;

sub function {
   warn "Error in module!";
}
1;

Khi được gọi từ một tập lệnh như dưới đây -

use T;
function();

Nó sẽ tạo ra kết quả sau:

Error in module! at T.pm line 9.

Đây ít nhiều là những gì bạn có thể mong đợi, nhưng không nhất thiết là những gì bạn muốn. Từ quan điểm của người lập trình mô-đun, thông tin này hữu ích vì nó giúp chỉ ra một lỗi trong chính mô-đun. Đối với người dùng cuối, thông tin được cung cấp là khá vô dụng, và đối với tất cả, trừ những lập trình viên chăm chỉ, nó hoàn toàn vô nghĩa.

Giải pháp cho những vấn đề như vậy là mô-đun Carp, cung cấp một phương pháp đơn giản để báo cáo lỗi trong các mô-đun trả về thông tin về tập lệnh gọi. Mô-đun Cá Chép cung cấp bốn chức năng: cá chép, kêu, kêu và thú nhận. Các chức năng này được thảo luận dưới đây.

Chức năng cá chép

Chức năng cá chép là tương đương cơ bản của cảnh báo và in thông báo tới STDERR mà không thực sự thoát tập lệnh và in tên tập lệnh.

package T;

require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;

sub function {
   carp "Error in module!";
}
1;

Khi được gọi từ một tập lệnh như dưới đây -

use T;
function();

Nó sẽ tạo ra kết quả sau:

Error in module! at test.pl line 4

Chức năng cluck

Hàm cluck là một loại cá chép tăng áp, nó tuân theo nguyên tắc cơ bản tương tự nhưng cũng in dấu vết ngăn xếp của tất cả các mô-đun dẫn đến hàm được gọi, bao gồm cả thông tin trên tập lệnh gốc.

package T;

require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp qw(cluck);

sub function {
   cluck "Error in module!";
}
1;

Khi được gọi từ một tập lệnh như dưới đây -

use T;
function();

Nó sẽ tạo ra kết quả sau:

Error in module! at T.pm line 9
   T::function() called at test.pl line 4

Hàm croak

Các croak chức năng tương đương với die, ngoại trừ việc nó báo cáo người gọi lên một cấp. Giống như die, hàm này cũng thoát script sau khi báo lỗi cho STDERR -

package T;

require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;

sub function {
   croak "Error in module!";
}
1;

Khi được gọi từ một tập lệnh như dưới đây -

use T;
function();

Nó sẽ tạo ra kết quả sau:

Error in module! at test.pl line 4

Đối với cá chép, các quy tắc cơ bản tương tự được áp dụng liên quan đến việc bao gồm thông tin dòng và tệp theo các chức năng cảnh báo và chết.

Chức năng thú nhận

Các confess chức năng giống như cluck; nó gọi die và sau đó in ra một dấu vết ngăn xếp cho đến tập lệnh gốc.

package T;

require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;

sub function {
   confess "Error in module!";
}
1;

Khi được gọi từ một tập lệnh như dưới đây -

use T;
function();

Nó sẽ tạo ra kết quả sau:

Error in module! at T.pm line 9
   T::function() called at test.pl line 4

Có một số biến có ý nghĩa xác định trước và đặc biệt trong Perl. Chúng là những biến sử dụng ký tự dấu câu sau chỉ báo biến thông thường ($, @ hoặc%), chẳng hạn như $ _ (giải thích bên dưới).

Hầu hết các biến đặc biệt có tên dài như tiếng Anh, ví dụ, biến Lỗi hệ điều hành $! có thể được viết là $ OS_ERROR. Nhưng nếu bạn định sử dụng tiếng Anh như tên, thì bạn sẽ phải đặt một dònguse English;ở đầu tệp chương trình của bạn. Điều này hướng dẫn trình thông dịch lấy ý nghĩa chính xác của biến.

Biến đặc biệt được sử dụng phổ biến nhất là $ _, chứa đầu vào mặc định và chuỗi tìm kiếm mẫu. Ví dụ, trong các dòng sau:

#!/usr/bin/perl

foreach ('hickory','dickory','doc') {
   print $_;
   print "\n";
}

Khi được thực thi, điều này sẽ tạo ra kết quả sau:

hickory
dickory
doc

Một lần nữa, hãy kiểm tra cùng một ví dụ mà không sử dụng biến $ _ một cách rõ ràng -

#!/usr/bin/perl

foreach ('hickory','dickory','doc') {
   print;
   print "\n";
}

Khi được thực thi, điều này cũng sẽ tạo ra kết quả sau:

hickory
dickory
doc

Lần đầu tiên thực hiện vòng lặp, "hickory" được in. Lần thứ hai, "dickory" được in, và lần thứ ba, "doc" được in. Đó là bởi vì trong mỗi lần lặp lại của vòng lặp, chuỗi hiện tại được đặt trong$_, and is used by default by print. Here are the places where Perl will assume $_ ngay cả khi bạn không chỉ định nó -

  • Các hàm đơn phân khác nhau, bao gồm các hàm như ord và int, cũng như tất cả các bài kiểm tra tệp (-f, -d) ngoại trừ -t, được mặc định là STDIN.

  • Các chức năng danh sách khác nhau như in và hủy liên kết.

  • Các phép toán so khớp mẫu m //, s /// và tr /// khi được sử dụng mà không có toán tử = ~.

  • Biến trình lặp mặc định trong vòng lặp foreach nếu không có biến nào khác được cung cấp.

  • Biến vòng lặp ngầm định trong hàm grep và hàm ánh xạ.

  • Vị trí mặc định để đặt bản ghi đầu vào khi kết quả của thao tác nhập dòng được tự nó kiểm tra như là tiêu chí duy nhất của kiểm tra trong khi (ví dụ:). Lưu ý rằng ngoài một thời gian thử nghiệm, điều này sẽ không xảy ra.

Các loại biến đặc biệt

Dựa trên cách sử dụng và bản chất của các biến đặc biệt, chúng ta có thể phân loại chúng theo các loại sau:

  • Biến đặc biệt vô hướng toàn cục.
  • Biến đặc biệt mảng toàn cục.
  • Các biến đặc biệt băm toàn cục.
  • Xử lý tập tin đặc biệt toàn cầu.
  • Hằng số đặc biệt toàn cầu.
  • Biến Đặc biệt Biểu thức Thông thường.
  • Filehandle Biến đặc biệt.

Biến đặc biệt vô hướng toàn cục

Đây là danh sách tất cả các biến đặc biệt vô hướng. Chúng tôi đã liệt kê các tên tương ứng như tiếng Anh cùng với các tên tượng trưng.

$ _ Không gian tìm kiếm mẫu và đầu vào mặc định.
$ ARG
$. Số dòng đầu vào hiện tại của bộ xử lý tệp cuối cùng đã được đọc. Một đóng rõ ràng trên xử lý tệp sẽ đặt lại số dòng.
$ NR
$ / Bộ tách bản ghi đầu vào; dòng mới theo mặc định. Nếu được đặt thành chuỗi null, nó sẽ coi các dòng trống là dấu phân cách.
$ RS
$, Dấu tách trường đầu ra cho toán tử in.
$ OFS
$ \ Dấu tách bản ghi đầu ra cho toán tử in.
$ ORS
$ " Giống như "$", ngoại trừ việc nó áp dụng cho các giá trị danh sách được nội suy vào một chuỗi được trích dẫn kép (hoặc chuỗi được diễn giải tương tự). Mặc định là một khoảng trắng.
$ LIST_SEPARATOR
$; Dấu phân tách chỉ số con để mô phỏng mảng nhiều chiều. Mặc định là "\ 034".
$SUBSCRIPT_SEPARATOR
$^L What a format outputs to perform a formfeed. Default is "\f".
$FORMAT_FORMFEED
$: The current set of characters after which a string may be broken to fill continuation fields (starting with ^) in a format. Default is "\n"".
$FORMAT_LINE_BREAK_CHARACTERS
$^A The current value of the write accumulator for format lines.
$ACCUMULATOR
$# Contains the output format for printed numbers (deprecated).
$OFMT
$? The status returned by the last pipe close, backtick (``) command, or system operator.
$CHILD_ERROR
$! If used in a numeric context, yields the current value of the errno variable, identifying the last system call error. If used in a string context, yields the corresponding system error string.
$OS_ERROR or $ERRNO
$@ The Perl syntax error message from the last eval command.
$EVAL_ERROR
$$ The pid of the Perl process running this script.
$PROCESS_ID or $PID
$< The real user ID (uid) of this process.
$REAL_USER_ID or $UID
$> The effective user ID of this process.
$EFFECTIVE_USER_ID or $EUID
$( The real group ID (gid) of this process.
$REAL_GROUP_ID or $GID
$) The effective gid of this process.
$EFFECTIVE_GROUP_ID or $EGID
$0 Contains the name of the file containing the Perl script being executed.
$PROGRAM_NAME
$[ The index of the first element in an array and of the first character in a substring. Default is 0.
$] Returns the version plus patchlevel divided by 1000.
$PERL_VERSION
$^D The current value of the debugging flags.
$DEBUGGING
$^E Extended error message on some platforms.
$EXTENDED_OS_ERROR
$^F The maximum system file descriptor, ordinarily 2.
$SYSTEM_FD_MAX
$^H Contains internal compiler hints enabled by certain pragmatic modules.
$^I The current value of the inplace-edit extension. Use undef to disable inplace editing.
$INPLACE_EDIT
$^M The contents of $M can be used as an emergency memory pool in case Perl dies with an out-of-memory error. Use of $M requires a special compilation of Perl. See the INSTALL document for more information.
$^O Contains the name of the operating system that the current Perl binary was compiled for.
$OSNAME
$^P The internal flag that the debugger clears so that it doesn't debug itself.
$PERLDB
$^T The time at which the script began running, in seconds since the epoch.
$BASETIME
$^W The current value of the warning switch, either true or false.
$WARNING
$^X The name that the Perl binary itself was executed as.
$EXECUTABLE_NAME
$ARGV Contains the name of the current file when reading from <ARGV>.

Global Array Special Variables

@ARGV The array containing the command-line arguments intended for the script.
@INC The array containing the list of places to look for Perl scripts to be evaluated by the do, require, or use constructs.
@F The array into which the input lines are split when the -a command-line switch is given.

Global Hash Special Variables

%INC The hash containing entries for the filename of each file that has been included via do or require.
%ENV The hash containing your current environment.
%SIG The hash used to set signal handlers for various signals.

Global Special Filehandles

ARGV The special filehandle that iterates over command line filenames in @ARGV. Usually written as the null filehandle in <>.
STDERR The special filehandle for standard error in any package.
STDIN The special filehandle for standard input in any package.
STDOUT The special filehandle for standard output in any package.
DATA The special filehandle that refers to anything following the __END__ token in the file containing the script. Or, the special filehandle for anything following the __DATA__ token in a required file, as long as you're reading data in the same package __DATA__ was found in.
_ (underscore) The special filehandle used to cache the information from the last stat, lstat, or file test operator.

Global Special Constants

__END__ Indicates the logical end of your program. Any following text is ignored, but may be read via the DATA filehandle.
__FILE__ Represents the filename at the point in your program where it's used. Not interpolated into strings.
__LINE__ Represents the current line number. Not interpolated into strings.
__PACKAGE__ Represents the current package name at compile time, or undefined if there is no current package. Not interpolated into strings.

Regular Expression Special Variables

$digit Contains the text matched by the corresponding set of parentheses in the last pattern matched. For example, $1 matches whatever was contained in the first set of parentheses in the previous regular expression.
$& The string matched by the last successful pattern match.
$MATCH
$` The string preceding whatever was matched by the last successful pattern match.
$PREMATCH
$' The string following whatever was matched by the last successful pattern match.
$POSTMATCH
$+ The last bracket matched by the last search pattern. This is useful if you don't know which of a set of alternative patterns was matched. For example : /Version: (.*)|Revision: (.*)/ && ($rev = $+);
$LAST_PAREN_MATCH

Filehandle Special Variables

$| If set to nonzero, forces an fflush(3) after every write or print on the currently selected output channel.
$OUTPUT_AUTOFLUSH
$% The current page number of the currently selected output channel.
$FORMAT_PAGE_NUMBER
$= The current page length (printable lines) of the currently selected output channel. Default is 60.
$FORMAT_LINES_PER_PAGE
$- The number of lines left on the page of the currently selected output channel.
$FORMAT_LINES_LEFT
$~ The name of the current report format for the currently selected output channel. Default is the name of the filehandle.
$FORMAT_NAME
$^ The name of the current top-of-page format for the currently selected output channel. Default is the name of the filehandle with _TOP appended.
$FORMAT_TOP_NAME

Each programmer will, of course, have his or her own preferences in regards to formatting, but there are some general guidelines that will make your programs easier to read, understand, and maintain.

The most important thing is to run your programs under the -w flag at all times. You may turn it off explicitly for particular portions of code via the no warnings pragma or the $^W variable if you must. You should also always run under use strict or know the reason why not. The use sigtrap and even use diagnostics pragmas may also prove useful.

Regarding aesthetics of code lay out, about the only thing Larry cares strongly about is that the closing curly bracket of a multi-line BLOCK should line up with the keyword that started the construct. Beyond that, he has other preferences that aren't so strong −

  • 4-column indent.
  • Opening curly on same line as keyword, if possible, otherwise line up.
  • Space before the opening curly of a multi-line BLOCK.
  • One-line BLOCK may be put on one line, including curlies.
  • No space before the semicolon.
  • Semicolon omitted in "short" one-line BLOCK.
  • Space around most operators.
  • Space around a "complex" subscript (inside brackets).
  • Blank lines between chunks that do different things.
  • Uncuddled elses.
  • No space between function name and its opening parenthesis.
  • Space after each comma.
  • Long lines broken after an operator (except and and or).
  • Space after last parenthesis matching on current line.
  • Line up corresponding items vertically.
  • Omit redundant punctuation as long as clarity doesn't suffer.

Here are some other more substantive style issues to think about: Just because you CAN do something a particular way doesn't mean that you SHOULD do it that way. Perl is designed to give you several ways to do anything, so consider picking the most readable one. For instance −

open(FOO,$foo) || die "Can't open $foo: $!";

Is better than −

die "Can't open $foo: $!" unless open(FOO,$foo);

Because the second way hides the main point of the statement in a modifier. On the other hand,

print "Starting analysis\n" if $verbose;

Is better than −

$verbose && print "Starting analysis\n";

Because the main point isn't whether the user typed -v or not.

Don't go through silly contortions to exit a loop at the top or the bottom, when Perl provides the last operator so you can exit in the middle. Just "outdent" it a little to make it more visible −

LINE:
for (;;) {
   statements;
   last LINE if $foo;
   next LINE if /^#/;
   statements;
}

Let's see few more important points −

  • Don't be afraid to use loop labels--they're there to enhance readability as well as to allow multilevel loop breaks. See the previous example.

  • Avoid using grep() (or map()) or `backticks` in a void context, that is, when you just throw away their return values. Those functions all have return values, so use them. Otherwise use a foreach() loop or the system() function instead.

  • For portability, when using features that may not be implemented on every machine, test the construct in an eval to see if it fails. If you know what version or patchlevel a particular feature was implemented, you can test $] ($PERL_VERSION in English) to see if it will be there. The Config module will also let you interrogate values determined by the Configure program when Perl was installed.

  • Choose mnemonic identifiers. If you can't remember what mnemonic means, you've got a problem.

  • While short identifiers like $gotit are probably ok, use underscores to separate words in longer identifiers. It is generally easier to read $var_names_like_this than $VarNamesLikeThis, especially for non-native speakers of English. It's also a simple rule that works consistently with VAR_NAMES_LIKE_THIS.

  • Package names are sometimes an exception to this rule. Perl informally reserves lowercase module names for "pragma" modules like integer and strict. Other modules should begin with a capital letter and use mixed case, but probably without underscores due to limitations in primitive file systems' representations of module names as files that must fit into a few sparse bytes.

  • If you have a really hairy regular expression, use the /x modifier and put in some whitespace to make it look a little less like line noise. Don't use slash as a delimiter when your regexp has slashes or backslashes.

  • Always check the return codes of system calls. Good error messages should go to STDERR, include which program caused the problem, what the failed system call and arguments were, and (VERY IMPORTANT) should contain the standard system error message for what went wrong. Here's a simple but sufficient example −

opendir(D, $dir) or die "can't opendir $dir: $!";
  • Suy nghĩ về khả năng tái sử dụng. Tại sao lại lãng phí chất xám vào một cú bấm máy trong khi bạn có thể muốn làm lại điều gì đó như vậy? Xem xét việc tổng quát hóa mã của bạn. Xem xét việc viết một mô-đun hoặc lớp đối tượng. Cân nhắc làm cho mã của bạn chạy rõ ràng với các cảnh báo sử dụng nghiêm ngặt và sử dụng (hoặc -w) có hiệu lực. Cân nhắc việc tặng mã của bạn. Cân nhắc thay đổi toàn bộ thế giới quan của bạn. Hãy xem xét ... oh, đừng bận tâm.

  • Hãy kiên định.

  • Hãy tử tế.

Biểu thức chính quy là một chuỗi ký tự xác định mẫu hoặc các mẫu bạn đang xem. Cú pháp của biểu thức chính quy trong Perl rất giống với những gì bạn sẽ tìm thấy trong các biểu thức chính quy khác. Các chương trình hỗ trợ, chẳng hạn nhưsed, grepawk.

Phương pháp cơ bản để áp dụng một biểu thức chính quy là sử dụng các toán tử liên kết mẫu = ~ và !~. Toán tử đầu tiên là toán tử kiểm tra và gán.

Có ba toán tử biểu thức chính quy trong Perl.

  • Khớp biểu thức chính quy - m //
  • Biểu thức chính quy thay thế - s ///
  • Chuyển ngữ cụm từ thông dụng - tr ///

Các dấu gạch chéo về phía trước trong mỗi trường hợp đóng vai trò là dấu phân cách cho biểu thức chính quy (regex) mà bạn đang chỉ định. Nếu bạn cảm thấy thoải mái với bất kỳ dấu phân cách nào khác, thì bạn có thể sử dụng thay cho dấu gạch chéo.

Người điều hành trận đấu

Toán tử so khớp, m //, được sử dụng để so khớp một chuỗi hoặc câu lệnh với một biểu thức chính quy. Ví dụ: để khớp chuỗi ký tự "foo" với thanh $ vô hướng, bạn có thể sử dụng một câu lệnh như sau:

#!/usr/bin/perl

$bar = "This is foo and again foo"; if ($bar =~ /foo/) {
   print "First time is matching\n";
} else {
   print "First time is not matching\n";
}

$bar = "foo"; if ($bar =~ /foo/) {
   print "Second time is matching\n";
} else {
   print "Second time is not matching\n";
}

Khi chương trình trên được thực thi, nó tạo ra kết quả sau:

First time is matching
Second time is matching

M // thực sự hoạt động theo kiểu giống như dãy toán tử q //. Bạn có thể sử dụng bất kỳ tổ hợp ký tự nào đối sánh tự nhiên để hoạt động như dấu phân cách cho biểu thức. Ví dụ: m {}, m () và m> <đều hợp lệ. Vì vậy, ví dụ trên có thể được viết lại như sau:

#!/usr/bin/perl

$bar = "This is foo and again foo"; if ($bar =~ m[foo]) {
   print "First time is matching\n";
} else {
   print "First time is not matching\n";
}

$bar = "foo"; if ($bar =~ m{foo}) {
   print "Second time is matching\n";
} else {
   print "Second time is not matching\n";
}

Bạn có thể bỏ m khỏi m // nếu các dấu phân cách là dấu gạch chéo về phía trước, nhưng đối với tất cả các dấu phân cách khác, bạn phải sử dụng tiền tố m.

Lưu ý rằng toàn bộ biểu thức đối sánh, đó là biểu thức ở bên trái của = ~ hoặc! ~ Và toán tử đối sánh, trả về true (trong ngữ cảnh vô hướng) nếu biểu thức khớp. Do đó, tuyên bố -

$true = ($foo =~ m/foo/);

sẽ thiết lập $true to 1 if $foo khớp với regex hoặc 0 nếu kết quả không thành công. Trong ngữ cảnh danh sách, đối sánh trả về nội dung của bất kỳ biểu thức được nhóm nào. Ví dụ: khi trích xuất giờ, phút và giây từ một chuỗi thời gian, chúng ta có thể sử dụng:

my ($hours, $minutes, $seconds) = ($time =~ m/(\d+):(\d+):(\d+)/);

Công cụ sửa đổi toán tử đối sánh

Toán tử đối sánh hỗ trợ tập hợp các bổ ngữ của riêng nó. Công cụ sửa đổi / g cho phép đối sánh toàn cục. Bổ ngữ / i sẽ làm cho so khớp không phân biệt chữ hoa và chữ thường. Đây là danh sách đầy đủ các bổ ngữ

Sr.No. Công cụ sửa đổi & mô tả
1

i

Làm cho đối sánh không phân biệt chữ hoa chữ thường.

2

m

Chỉ định rằng nếu chuỗi có ký tự xuống dòng hoặc ký tự xuống dòng, thì các toán tử ^ và $ bây giờ sẽ khớp với ranh giới dòng mới, thay vì ranh giới chuỗi.

3

o

Chỉ đánh giá biểu thức một lần.

4

s

Cho phép sử dụng. để khớp với một ký tự dòng mới.

5

x

Cho phép bạn sử dụng khoảng trắng trong biểu thức cho rõ ràng.

6

g

Toàn cầu tìm thấy tất cả các trận đấu.

7

cg

Cho phép tìm kiếm tiếp tục ngay cả sau khi kết hợp toàn cầu không thành công.

Chỉ khớp một lần

Ngoài ra còn có một phiên bản đơn giản hơn của toán tử so khớp -? PATTERN? nhà điều hành. Điều này về cơ bản giống với toán tử m // ngoại trừ việc nó chỉ khớp một lần trong chuỗi mà bạn đang tìm kiếm giữa mỗi lần gọi để đặt lại.

Ví dụ: bạn có thể sử dụng điều này để lấy các phần tử đầu tiên và cuối cùng trong danh sách -

#!/usr/bin/perl

@list = qw/food foosball subeo footnote terfoot canic footbrdige/;

foreach (@list) {
   $first = $1 if /(foo.*?)/; $last = $1 if /(foo.*)/; } print "First: $first, Last: $last\n";

Khi chương trình trên được thực thi, nó tạo ra kết quả sau:

First: foo, Last: footbrdige

Biến biểu thức chính quy

Các biến biểu thức chính quy bao gồm $, chứa bất kỳ thứ gì mà trận đấu nhóm cuối cùng phù hợp; $&, chứa toàn bộ chuỗi được so khớp; $`, chứa mọi thứ trước chuỗi được so khớp; và$', chứa mọi thứ sau chuỗi được so khớp. Đoạn mã sau minh họa kết quả:

#!/usr/bin/perl

$string = "The food is in the salad bar";
$string =~ m/foo/; print "Before: $`\n";
print "Matched: $&\n"; print "After: $'\n";

Khi chương trình trên được thực thi, nó tạo ra kết quả sau:

Before: The
Matched: foo
After: d is in the salad bar

Người điều hành thay thế

Toán tử thay thế, s ///, thực sự chỉ là một phần mở rộng của toán tử so khớp cho phép bạn thay thế văn bản được so khớp bằng một số văn bản mới. Dạng cơ bản của toán tử là -

s/PATTERN/REPLACEMENT/;

PATTERN là biểu thức chính quy cho văn bản mà chúng tôi đang tìm kiếm. REPLACEMENT là một đặc tả cho văn bản hoặc biểu thức chính quy mà chúng tôi muốn sử dụng để thay thế văn bản được tìm thấy. Ví dụ: chúng tôi có thể thay thế tất cả các lần xuất hiện củadog với cat sử dụng biểu thức chính quy sau:

#/user/bin/perl

$string = "The cat sat on the mat"; $string =~ s/cat/dog/;

print "$string\n";

Khi chương trình trên được thực thi, nó tạo ra kết quả sau:

The dog sat on the mat

Công cụ sửa đổi toán tử thay thế

Đây là danh sách tất cả các từ bổ nghĩa được sử dụng với toán tử thay thế.

Sr.No. Công cụ sửa đổi & mô tả
1

i

Làm cho đối sánh không phân biệt chữ hoa chữ thường.

2

m

Chỉ định rằng nếu chuỗi có ký tự xuống dòng hoặc ký tự xuống dòng, thì các toán tử ^ và $ bây giờ sẽ khớp với ranh giới dòng mới, thay vì ranh giới chuỗi.

3

o

Chỉ đánh giá biểu thức một lần.

4

s

Cho phép sử dụng. để khớp với một ký tự dòng mới.

5

x

Cho phép bạn sử dụng khoảng trắng trong biểu thức cho rõ ràng.

6

g

Thay thế tất cả các lần xuất hiện của biểu thức tìm thấy bằng văn bản thay thế.

7

e

Đánh giá sự thay thế như thể nó là một câu lệnh Perl và sử dụng giá trị trả về của nó làm văn bản thay thế.

Nhà điều hành dịch thuật

Bản dịch tương tự, nhưng không giống với các nguyên tắc thay thế, nhưng không giống như thay thế, bản dịch (hoặc chuyển ngữ) không sử dụng cụm từ thông dụng để tìm kiếm các giá trị thay thế. Các toán tử dịch là -

tr/SEARCHLIST/REPLACEMENTLIST/cds
y/SEARCHLIST/REPLACEMENTLIST/cds

Bản dịch thay thế tất cả các lần xuất hiện của các ký tự trong DANH SÁCH TÌM KIẾM bằng các ký tự tương ứng trong DANH SÁCH THAY THẾ. Ví dụ: sử dụng "The cat sat on the mat." chuỗi chúng tôi đã sử dụng trong chương này -

#/user/bin/perl

$string = 'The cat sat on the mat'; $string =~ tr/a/o/;

print "$string\n";

Khi chương trình trên được thực thi, nó tạo ra kết quả sau:

The cot sot on the mot.

Phạm vi Perl tiêu chuẩn cũng có thể được sử dụng, cho phép bạn chỉ định phạm vi ký tự theo chữ cái hoặc giá trị số. Để thay đổi trường hợp của chuỗi, bạn có thể sử dụng cú pháp sau thay chouc chức năng.

$string =~ tr/a-z/A-Z/;

Công cụ sửa đổi toán tử dịch

Sau đây là danh sách các toán tử liên quan đến dịch thuật.

Sr.No. Công cụ sửa đổi & mô tả
1

c

Phần bổ sung TÌM KIẾM.

2

d

Xóa các ký tự được tìm thấy nhưng không có vị trí.

3

s

Dấu gạch chéo trùng lặp các ký tự được thay thế.

Công cụ sửa đổi / d sẽ xóa các ký tự khớp với DANH SÁCH TÌM KIẾM không có mục nhập tương ứng trong DANH SÁCH THAY THẾ. Ví dụ -

#!/usr/bin/perl 

$string = 'the cat sat on the mat.'; $string =~ tr/a-z/b/d;

print "$string\n";

Khi chương trình trên được thực thi, nó tạo ra kết quả sau:

b b   b.

Công cụ sửa đổi cuối cùng, / s, loại bỏ các chuỗi ký tự trùng lặp đã được thay thế, vì vậy -

#!/usr/bin/perl

$string = 'food';
$string = 'food'; $string =~ tr/a-z/a-z/s;

print "$string\n";

Khi chương trình trên được thực thi, nó tạo ra kết quả sau:

fod

Biểu thức chính quy phức tạp hơn

Bạn không chỉ phải khớp trên các chuỗi cố định. Trên thực tế, bạn có thể so khớp bất cứ thứ gì bạn có thể mơ ước bằng cách sử dụng các cụm từ thông dụng phức tạp hơn. Đây là một bảng gian lận nhanh -

Bảng sau liệt kê cú pháp biểu thức chính quy có sẵn trong Python.

Sr.No. Mô hình & Mô tả
1

^

Đối sánh đầu dòng.

2

$

Đối sánh với cuối dòng.

3

.

Khớp với bất kỳ ký tự đơn nào ngoại trừ dòng mới. Sử dụng tùy chọn m cũng cho phép nó khớp với dòng mới.

4

[...]

Khớp bất kỳ ký tự đơn nào trong ngoặc.

5

[^...]

Khớp bất kỳ ký tự đơn nào không có trong ngoặc.

6

*

Khớp với 0 hoặc nhiều lần xuất hiện của biểu thức trước.

7

+

So khớp 1 hoặc nhiều lần xuất hiện của biểu thức trước.

số 8

?

Khớp với 0 hoặc 1 lần xuất hiện của biểu thức trước.

9

{ n}

Khớp chính xác n số lần xuất hiện của biểu thức trước.

10

{ n,}

So khớp n hoặc nhiều lần xuất hiện của biểu thức trước.

11

{ n, m}

Khớp ít nhất n và nhiều nhất m lần xuất hiện của biểu thức trước.

12

a| b

Đối sánh với a hoặc b.

13

\w

Khớp các ký tự từ.

14

\W

Đối sánh các ký tự không phải từ khóa.

15

\s

Khớp khoảng trắng. Tương đương với [\ t \ n \ r \ f].

16

\S

Khớp với khoảng trắng.

17

\d

Khớp các chữ số. Tương đương với [0-9].

18

\D

Phù hợp với nondigits.

19

\A

Đối sánh với phần đầu của chuỗi.

20

\Z

Đối sánh với phần cuối của chuỗi. Nếu một dòng mới tồn tại, nó sẽ khớp ngay trước dòng mới.

21

\z

Đối sánh với phần cuối của chuỗi.

22

\G

Các trận đấu chỉ kết thúc trận đấu cuối cùng.

23

\b

Khớp các ranh giới từ khi nằm ngoài dấu ngoặc. Khớp với khoảng trắng lùi (0x08) khi bên trong dấu ngoặc.

24

\B

Đối sánh các ranh giới không có từ khóa.

25

\n, \t, etc.

Khớp với dòng mới, dấu xuống dòng, tab, v.v.

26

\1...\9

Đối sánh biểu thức con được nhóm thứ n.

27

\10

Đối sánh biểu thức con được nhóm thứ n nếu nó đã khớp. Mặt khác, đề cập đến biểu diễn bát phân của mã ký tự.

28

[aeiou]

Khớp một ký tự trong tập hợp đã cho

29

[^aeiou]

Khớp một ký tự bên ngoài tập hợp đã cho

^ Metacharacter khớp với phần đầu của chuỗi và $ metasymbol khớp với phần cuối của chuỗi. Dưới đây là một số ví dụ ngắn gọn.

# nothing in the string (start and end are adjacent)
/^$/   

# a three digits, each followed by a whitespace
# character (eg "3 4 5 ")
/(\d\s) {3}/  

# matches a string in which every
# odd-numbered letter is a (eg "abacadaf")
/(a.)+/  

# string starts with one or more digits
/^\d+/

# string that ends with one or more digits
/\d+$/

Hãy xem một ví dụ khác.

#!/usr/bin/perl

$string = "Cats go Catatonic\nWhen given Catnip";
($start) = ($string =~ /\A(.*?) /);
@lines = $string =~ /^(.*?) /gm; print "First word: $start\n","Line starts: @lines\n";

Khi chương trình trên được thực thi, nó tạo ra kết quả sau:

First word: Cats
Line starts: Cats When

Các ranh giới phù hợp

Các \bkhớp ở bất kỳ ranh giới từ nào, như được xác định bởi sự khác biệt giữa lớp \ w và lớp \ W. Vì \ w bao gồm các ký tự cho một từ và \ W ngược lại, điều này thường có nghĩa là sự kết thúc của một từ. Các\Bkhẳng định khớp với bất kỳ vị trí nào không phải là ranh giới từ. Ví dụ -

/\bcat\b/ # Matches 'the cat sat' but not 'cat on the mat'
/\Bcat\B/ # Matches 'verification' but not 'the cat on the mat'
/\bcat\B/ # Matches 'catatonic' but not 'polecat'
/\Bcat\b/ # Matches 'polecat' but not 'catatonic'

Lựa chọn các giải pháp thay thế

Các | ký tự giống như tiêu chuẩn hoặc bitwise HOẶC trong Perl. Nó chỉ định các kết quả thay thế trong một biểu thức chính quy hoặc nhóm. Ví dụ: để so khớp "cat" hoặc "dog" trong một biểu thức, bạn có thể sử dụng điều này -

if ($string =~ /cat|dog/)

Bạn có thể nhóm các phần tử riêng lẻ của một biểu thức lại với nhau để hỗ trợ các kết hợp phức tạp. Tìm kiếm tên của hai người có thể đạt được với hai bài kiểm tra riêng biệt, như thế này -

if (($string =~ /Martin Brown/) ||  ($string =~ /Sharon Brown/)) This could be written as follows if ($string =~ /(Martin|Sharon) Brown/)

Kết hợp nhóm

Từ quan điểm biểu thức chính quy, không có sự khác biệt giữa ngoại trừ, có lẽ, trước đây rõ ràng hơn một chút.

$string =~ /(\S+)\s+(\S+)/; and $string =~ /\S+\s+\S+/;

Tuy nhiên, lợi ích của việc nhóm là nó cho phép chúng ta trích xuất một chuỗi từ một biểu thức chính quy. Các nhóm được trả về dưới dạng danh sách theo thứ tự xuất hiện trong bản gốc. Ví dụ, trong đoạn sau, chúng tôi đã lấy ra giờ, phút và giây từ một chuỗi.

my ($hours, $minutes, $seconds) = ($time =~ m/(\d+):(\d+):(\d+)/);

Cũng như phương pháp trực tiếp này, các nhóm đã so khớp cũng có sẵn trong các biến $ x đặc biệt, trong đó x là số của nhóm trong biểu thức chính quy. Do đó, chúng tôi có thể viết lại ví dụ trước như sau:

#!/usr/bin/perl

$time = "12:05:30";

$time =~ m/(\d+):(\d+):(\d+)/; my ($hours, $minutes, $seconds) = ($1, $2, $3); print "Hours : $hours, Minutes: $minutes, Second: $seconds\n";

Khi chương trình trên được thực thi, nó tạo ra kết quả sau:

Hours : 12, Minutes: 05, Second: 30

Khi các nhóm được sử dụng trong biểu thức thay thế, cú pháp $ x có thể được sử dụng trong văn bản thay thế. Do đó, chúng tôi có thể định dạng lại chuỗi ngày bằng cách sử dụng:

#!/usr/bin/perl

$date = '03/26/1999';
$date =~ s#(\d+)/(\d+)/(\d+)#$3/$1/$2#;

print "$date\n";

Khi chương trình trên được thực thi, nó tạo ra kết quả sau:

1999/03/26

Khẳng định \ G

Xác nhận \ G cho phép bạn tiếp tục tìm kiếm từ thời điểm trận đấu cuối cùng xảy ra. Ví dụ: trong đoạn mã sau, chúng tôi đã sử dụng \ G để chúng tôi có thể tìm kiếm đến đúng vị trí và sau đó trích xuất một số thông tin mà không cần phải tạo một biểu thức chính quy phức tạp hơn -

#!/usr/bin/perl

$string = "The time is: 12:31:02 on 4/12/00";

$string =~ /:\s+/g; ($time) = ($string =~ /\G(\d+:\d+:\d+)/); $string =~ /.+\s+/g;
($date) = ($string =~ m{\G(\d+/\d+/\d+)});

print "Time: $time, Date: $date\n";

Khi chương trình trên được thực thi, nó tạo ra kết quả sau:

Time: 12:31:02, Date: 4/12/00

Khẳng định \ G thực ra chỉ là metasymbol tương đương của hàm pos, vì vậy giữa các lệnh gọi biểu thức chính quy, bạn có thể tiếp tục sử dụng pos, và thậm chí sửa đổi giá trị của pos (và do đó là \ G) bằng cách sử dụng pos làm chương trình con lvalue.

Ví dụ về biểu thức chính quy

Nhân vật văn học

Sr.No. Ví dụ & Mô tả
1

Perl

Khớp "Perl".

Các lớp nhân vật

Sr.No. Ví dụ & Mô tả
1

[Pp]ython

Đối sánh với "Python" hoặc "python"

2

rub[ye]

Đối sánh với "ruby" hoặc "rube"

3

[aeiou]

Khớp với bất kỳ một nguyên âm chữ thường nào

4

[0-9]

Khớp với bất kỳ chữ số nào; giống với [0123456789]

5

[a-z]

Khớp với mọi ký tự ASCII viết thường

6

[A-Z]

Khớp với bất kỳ ký tự ASCII viết hoa nào

7

[a-zA-Z0-9]

Phù hợp với bất kỳ điều nào ở trên

số 8

[^aeiou]

Khớp với bất kỳ thứ gì khác ngoài một nguyên âm viết thường

9

[^0-9]

Khớp với bất kỳ thứ gì khác ngoài một chữ số

Các lớp nhân vật đặc biệt

Sr.No. Ví dụ & Mô tả
1

.

Khớp với bất kỳ ký tự nào ngoại trừ dòng mới

2

\d

Khớp một chữ số: [0-9]

3

\D

Đối sánh với một nondigit: [^ 0-9]

4

\s

Khớp với ký tự khoảng trắng: [\ t \ r \ n \ f]

5

\S

Khớp với khoảng trắng: [^ \ t \ r \ n \ f]

6

\w

Khớp một ký tự từ đơn: [A-Za-z0-9_]

7

\W

Khớp một ký tự không phải là từ khóa: [^ A-Za-z0-9_]

Các trường hợp lặp lại

Sr.No. Ví dụ & Mô tả
1

ruby?

Đối sánh với "rub" hoặc "ruby": y là tùy chọn

2

ruby*

Đối sánh "chà" cộng với 0 hoặc nhiều y

3

ruby+

Đối sánh "chà" cộng với 1 hoặc nhiều y

4

\d{3}

Khớp chính xác 3 chữ số

5

\d{3,}

Khớp với 3 chữ số trở lên

6.

\d{3,5}

Đối sánh 3, 4 hoặc 5 chữ số

Sự lặp lại nông dân

Điều này phù hợp với số lần lặp lại nhỏ nhất -

Sr.No. Ví dụ & Mô tả
1

<.*>

Lặp lại tham lam: khớp với "<python> perl>"

2

<.*?>

Nongreedy: đối sánh "<python>" trong "<python> perl>"

Phân nhóm bằng dấu ngoặc đơn

Sr.No. Ví dụ & Mô tả
1

\D\d+

Không có nhóm: + lặp lại \ d

2

(\D\d)+

Đã nhóm: + lặp lại cặp \ D \ d

3

([Pp]ython(, )?)+

Khớp "Python", "Python, python, python", v.v.

Tài liệu tham khảo

Điều này khớp lại với một nhóm đã khớp trước đó -

Sr.No. Ví dụ & Mô tả
1

([Pp])ython&\1ails

Khớp với python & pails hoặc Python & Pails

2

(['"])[^\1]*\1

Chuỗi được trích dẫn đơn hoặc kép. \ 1 đối sánh với bất kỳ thứ gì mà nhóm đầu tiên phù hợp. \ 2 đối sánh với bất kỳ thứ gì mà nhóm thứ 2 phù hợp, v.v.

Giải pháp thay thế

Sr.No. Ví dụ & Mô tả
1

python|perl

Đối sánh với "python" hoặc "perl"

2

rub(y|le))

Đối sánh với "ruby" hoặc "rúp"

3

Python(!+|\?)

"Python" được theo sau bởi một hoặc nhiều! hay một cái?

Mỏ neo

Điều này cần phải xác định các vị trí khớp.

Sr.No. Ví dụ & Mô tả
1

^Python

Đối sánh "Python" ở đầu chuỗi hoặc dòng nội bộ

2

Python$

Đối sánh "Python" ở cuối chuỗi hoặc dòng

3

\APython

Đối sánh với "Python" ở đầu chuỗi

4

Python\Z

Đối sánh "Python" ở cuối một chuỗi

5

\bPython\b

Đối sánh "Python" ở ranh giới từ

6

\brub\B

\ B là ranh giới không có từ khóa: đối sánh "rub" trong "rube" và "ruby" nhưng không đối sánh một mình

7

Python(?=!)

Đối sánh với "Python", nếu theo sau là dấu chấm than

số 8

Python(?!!)

Đối sánh với "Python", nếu không có dấu chấm than theo sau

Cú pháp đặc biệt với dấu ngoặc đơn

Sr.No. Ví dụ & Mô tả
1

R(?#comment)

Đối sánh với "R". Tất cả phần còn lại là bình luận

2

R(?i)uby

Không phân biệt chữ hoa chữ thường khi đối sánh "uby"

3

R(?i:uby)

Giống như trên

4

rub(?:y|le))

Chỉ nhóm mà không tạo \ 1 backreference

Sử dụng Tiện ích sendmail

Gửi một tin nhắn đơn giản

Nếu bạn đang làm việc trên máy Linux / Unix thì bạn chỉ cần sử dụng sendmailtiện ích bên trong chương trình Perl của bạn để gửi email. Đây là một tập lệnh mẫu có thể gửi email đến một ID email nhất định. Chỉ cần đảm bảo rằng đường dẫn cho tiện ích sendmail là chính xác. Điều này có thể khác đối với máy Linux / Unix của bạn.

#!/usr/bin/perl
 
$to = '[email protected]';
$from = '[email protected]'; $subject = 'Test Email';
$message = 'This is test email sent by Perl Script'; open(MAIL, "|/usr/sbin/sendmail -t"); # Email Header print MAIL "To: $to\n";
print MAIL "From: $from\n"; print MAIL "Subject: $subject\n\n";
# Email Body
print MAIL $message;

close(MAIL);
print "Email Sent Successfully\n";

Trên thực tế, tập lệnh trên là một tập lệnh email khách, sẽ soạn thảo email và gửi đến máy chủ đang chạy cục bộ trên máy Linux / Unix của bạn. Tập lệnh này sẽ không chịu trách nhiệm gửi email đến đích thực. Vì vậy, bạn phải đảm bảo máy chủ email được định cấu hình đúng cách và đang chạy trên máy của bạn để gửi email đến ID email đã cho.

Gửi tin nhắn HTML

Nếu bạn muốn gửi email có định dạng HTML bằng sendmail, thì bạn chỉ cần thêm Content-type: text/html\n trong phần tiêu đề của email như sau:

#!/usr/bin/perl
 
$to = '[email protected]';
$from = '[email protected]'; $subject = 'Test Email';
$message = '<h1>This is test email sent by Perl Script</h1>'; open(MAIL, "|/usr/sbin/sendmail -t"); # Email Header print MAIL "To: $to\n";
print MAIL "From: $from\n"; print MAIL "Subject: $subject\n\n";
print MAIL "Content-type: text/html\n";
# Email Body
print MAIL $message;

close(MAIL);
print "Email Sent Successfully\n";

Sử dụng MIME :: Mô-đun Lite

Nếu bạn đang làm việc trên máy tính Windows, thì bạn sẽ không có quyền truy cập vào tiện ích sendmail. Nhưng bạn có cách khác để viết ứng dụng email của riêng bạn bằng cách sử dụng mô-đun MIME: Lite perl. Bạn có thể tải xuống mô-đun này từ MIME-Lite-3.01.tar.gz và cài đặt nó trên máy tính Windows hoặc Linux / Unix của bạn. Để cài đặt nó, hãy làm theo các bước đơn giản -

$tar xvfz MIME-Lite-3.01.tar.gz
$cd MIME-Lite-3.01 $perl Makefile.PL
$make $make install

Vậy là xong và bạn sẽ có mô-đun MIME :: Lite được cài đặt trên máy của mình. Bây giờ bạn đã sẵn sàng để gửi email của mình với các tập lệnh đơn giản được giải thích bên dưới.

Gửi một tin nhắn đơn giản

Bây giờ sau đây là một tập lệnh sẽ xử lý việc gửi email đến ID email đã cho -

#!/usr/bin/perl
use MIME::Lite;
 
$to = '[email protected]'; $cc = '[email protected]';
$from = '[email protected]'; $subject = 'Test Email';
$message = 'This is test email sent by Perl Script'; $msg = MIME::Lite->new(
                 From     => $from, To => $to,
                 Cc       => $cc, Subject => $subject,
                 Data     => $message ); $msg->send;
print "Email Sent Successfully\n";

Gửi tin nhắn HTML

Nếu bạn muốn gửi email có định dạng HTML bằng sendmail, thì bạn chỉ cần thêm Content-type: text/html\ntrong phần tiêu đề của email. Sau đây là tập lệnh, sẽ xử lý việc gửi email có định dạng HTML -

#!/usr/bin/perl
use MIME::Lite;
 
$to = '[email protected]'; $cc = '[email protected]';
$from = '[email protected]'; $subject = 'Test Email';
$message = '<h1>This is test email sent by Perl Script</h1>'; $msg = MIME::Lite->new(
                 From     => $from, To => $to,
                 Cc       => $cc, Subject => $subject,
                 Data     => $message ); $msg->attr("content-type" => "text/html");         
$msg->send;
print "Email Sent Successfully\n";

Gửi tệp đính kèm

Nếu bạn muốn gửi một tệp đính kèm, thì tập lệnh sau sẽ phục vụ mục đích:

#!/usr/bin/perl
use MIME::Lite;
 
$to = '[email protected]';
$cc = '[email protected]'; $from = '[email protected]';
$subject = 'Test Email'; $message = 'This is test email sent by Perl Script';

$msg = MIME::Lite->new( From => $from,
                 To       => $to, Cc => $cc,
                 Subject  => $subject, Type => 'multipart/mixed' ); # Add your text message. $msg->attach(Type         => 'text',
             Data         => $message ); # Specify your file as attachement. $msg->attach(Type         => 'image/gif',
             Path         => '/tmp/logo.gif',
             Filename     => 'logo.gif',
             Disposition  => 'attachment'
            );       
$msg->send;
print "Email Sent Successfully\n";

Bạn có thể đính kèm bao nhiêu tệp tùy thích trong email của mình bằng phương thức đính kèm ().

Sử dụng Máy chủ SMTP

Nếu máy của bạn không chạy máy chủ email thì bạn có thể sử dụng bất kỳ máy chủ email nào khác có sẵn tại vị trí từ xa. Nhưng để sử dụng bất kỳ máy chủ email nào khác, bạn sẽ cần phải có id, mật khẩu, URL của nó, v.v. Khi bạn có tất cả thông tin cần thiết, bạn chỉ cần cung cấp thông tin đó trongsend() phương pháp như sau -

$msg->send('smtp', "smtp.myisp.net", AuthUser=>"id", AuthPass=>"password" );

Bạn có thể liên hệ với quản trị viên máy chủ email của mình để có thông tin đã sử dụng ở trên và nếu chưa có id người dùng và mật khẩu thì quản trị viên của bạn có thể tạo thông tin đó trong vài phút.

Socket là gì?

Socket là một cơ chế Berkeley UNIX tạo kết nối song công ảo giữa các tiến trình khác nhau. Điều này sau đó đã được chuyển sang mọi hệ điều hành đã biết cho phép giao tiếp giữa các hệ thống qua vị trí địa lý chạy trên phần mềm hệ điều hành khác nhau. Nếu không có socket, hầu hết giao tiếp mạng giữa các hệ thống sẽ không bao giờ xảy ra.

Xem xét kỹ hơn; một hệ thống máy tính điển hình trên mạng nhận và gửi thông tin theo mong muốn của các ứng dụng khác nhau chạy trên đó. Thông tin này được chuyển đến hệ thống, vì một địa chỉ IP duy nhất được chỉ định cho nó. Trên hệ thống, thông tin này được cung cấp cho các ứng dụng liên quan, các ứng dụng này sẽ lắng nghe trên các cổng khác nhau. Ví dụ: một trình duyệt internet lắng nghe trên cổng 80 để biết thông tin nhận được từ máy chủ web. Ngoài ra, chúng tôi có thể viết các ứng dụng tùy chỉnh của chúng tôi có thể nghe và gửi / nhận thông tin về một số cổng cụ thể.

Bây giờ, chúng ta hãy tóm tắt rằng một ổ cắm là một địa chỉ IP và một cổng, cho phép kết nối để gửi và nhận dữ liệu qua mạng.

Để giải thích khái niệm socket đã đề cập ở trên, chúng ta sẽ lấy một ví dụ về Lập trình Máy khách - Máy chủ sử dụng Perl. Để hoàn thành kiến ​​trúc máy chủ khách hàng, chúng tôi sẽ phải thực hiện các bước sau:

Để tạo máy chủ

  • Tạo một ổ cắm bằng cách sử dụng socket gọi.

  • Liên kết ổ cắm với một địa chỉ cổng bằng cách sử dụng bind gọi.

  • Nghe ổ cắm tại địa chỉ cổng bằng listen gọi.

  • Chấp nhận kết nối máy khách bằng accept gọi.

Để tạo khách hàng

  • Tạo một ổ cắm với socket gọi.

  • Kết nối (ổ cắm) với máy chủ bằng connect gọi.

Sơ đồ sau cho thấy trình tự hoàn chỉnh của các lệnh gọi được Máy khách và Máy chủ sử dụng để giao tiếp với nhau -

Cuộc gọi ổ cắm phía máy chủ

Cuộc gọi socket ()

Các socket()cuộc gọi là cuộc gọi đầu tiên trong việc thiết lập kết nối mạng là tạo một ổ cắm. Cuộc gọi này có cú pháp sau:

socket( SOCKET, DOMAIN, TYPE, PROTOCOL );

Cuộc gọi trên tạo ra một SOCKET và ba đối số khác là các số nguyên phải có các giá trị sau cho kết nối TCP / IP.

  • DOMAINphải là PF_INET. Có thể là 2 trên máy tính của bạn.

  • TYPE phải là SOCK_STREAM cho kết nối TCP / IP.

  • PROTOCOL nên là (getprotobyname('tcp'))[2]. Đó là giao thức cụ thể như TCP được nói qua socket.

Vì vậy, lệnh gọi hàm socket do máy chủ đưa ra sẽ giống như thế này -

use Socket     # This defines PF_INET and SOCK_STREAM

socket(SOCKET,PF_INET,SOCK_STREAM,(getprotobyname('tcp'))[2]);

Lệnh gọi bind ()

Các ổ cắm được tạo bởi lệnh gọi socket () sẽ vô dụng cho đến khi chúng được liên kết với tên máy chủ và số cổng. Máy chủ sử dụng những thứ saubind() chức năng chỉ định cổng mà họ sẽ chấp nhận kết nối từ các máy khách.

bind( SOCKET, ADDRESS );

Ở đây SOCKET là bộ mô tả được trả về bởi lệnh gọi socket () và ADDRESS là địa chỉ socket (đối với TCP / IP) chứa ba phần tử:

  • Họ địa chỉ (Đối với TCP / IP, đó là AF_INET, có thể là 2 trên hệ thống của bạn).

  • Số cổng (ví dụ 21).

  • Địa chỉ internet của máy tính (ví dụ: 10.12.12.168).

As the bind() is used by a server, which does not need to know its own address so the argument list looks like this −

use Socket        # This defines PF_INET and SOCK_STREAM

$port = 12345; # The unique port used by the sever to listen requests $server_ip_address = "10.12.12.168";
bind( SOCKET, pack_sockaddr_in($port, inet_aton($server_ip_address)))
   or die "Can't bind to port $port! \n";

The or die clause is very important because if a server dies without outstanding connections, the port won't be immediately reusable unless you use the option SO_REUSEADDR using setsockopt() function. Here pack_sockaddr_in() function is being used to pack the Port and IP address into binary format.

The listen() call

If this is a server program, then it is required to issue a call to listen() on the specified port to listen, i.e., wait for the incoming requests. This call has the following syntax −

listen( SOCKET, QUEUESIZE );

The above call uses SOCKET descriptor returned by socket() call and QUEUESIZE is the maximum number of outstanding connection request allowed simultaneously.

The accept() call

If this is a server program then it is required to issue a call to the access() function to accept the incoming connections. This call has the following syntax −

accept( NEW_SOCKET, SOCKET );

The accept call receive SOCKET descriptor returned by socket() function and upon successful completion, a new socket descriptor NEW_SOCKET is returned for all future communication between the client and the server. If access() call fails, then it returns FLASE which is defined in Socket module which we have used initially.

Generally, accept() is used in an infinite loop. As soon as one connection arrives the server either creates a child process to deal with it or serves it himself and then goes back to listen for more connections.

while(1) {
   accept( NEW_SOCKET, SOCKT );
   .......
}

Now all the calls related to server are over and let us see a call which will be required by the client.

Client Side Socket Calls

The connect() call

If you are going to prepare client program, then first you will use socket() call to create a socket and then you would have to use connect() call to connect to the server. You already have seen socket() call syntax and it will remain similar to server socket() call, but here is the syntax for connect() call −

connect( SOCKET, ADDRESS );

Here SCOKET is the socket descriptor returned by socket() call issued by the client and ADDRESS is a socket address similar to bind call, except that it contains the IP address of the remote server.

$port = 21;    # For example, the ftp port
$server_ip_address = "10.12.12.168"; connect( SOCKET, pack_sockaddr_in($port, inet_aton($server_ip_address))) or die "Can't connect to port $port! \n";

If you connect to the server successfully, then you can start sending your commands to the server using SOCKET descriptor, otherwise your client will come out by giving an error message.

Client - Server Example

Following is a Perl code to implement a simple client-server program using Perl socket. Here server listens for incoming requests and once connection is established, it simply replies Smile from the server. The client reads that message and print on the screen. Let's see how it has been done, assuming we have our server and client on the same machine.

Script to Create a Server

#!/usr/bin/perl -w
# Filename : server.pl

use strict;
use Socket;

# use port 7890 as default
my $port = shift || 7890; my $proto = getprotobyname('tcp');
my $server = "localhost"; # Host IP running the server # create a socket, make it reusable socket(SOCKET, PF_INET, SOCK_STREAM, $proto)
   or die "Can't open socket $!\n"; setsockopt(SOCKET, SOL_SOCKET, SO_REUSEADDR, 1) or die "Can't set socket option to SO_REUSEADDR $!\n";

# bind to a port, then listen
bind( SOCKET, pack_sockaddr_in($port, inet_aton($server)))
   or die "Can't bind to port $port! \n"; listen(SOCKET, 5) or die "listen: $!";
print "SERVER started on port $port\n"; # accepting a connection my $client_addr;
while ($client_addr = accept(NEW_SOCKET, SOCKET)) { # send them a message, close connection my $name = gethostbyaddr($client_addr, AF_INET ); print NEW_SOCKET "Smile from the server"; print "Connection recieved from $name\n";
   close NEW_SOCKET;
}

To run the server in background mode issue the following command on Unix prompt −

$perl sever.pl&

Script to Create a Client

!/usr/bin/perl -w
# Filename : client.pl

use strict;
use Socket;

# initialize host and port
my $host = shift || 'localhost';
my $port = shift || 7890; my $server = "localhost";  # Host IP running the server

# create the socket, connect to the port
socket(SOCKET,PF_INET,SOCK_STREAM,(getprotobyname('tcp'))[2])
   or die "Can't create a socket $!\n"; connect( SOCKET, pack_sockaddr_in($port, inet_aton($server))) or die "Can't connect to port $port! \n";

my $line; while ($line = <SOCKET>) {
   print "$line\n"; } close SOCKET or die "close: $!";

Now let's start our client at the command prompt, which will connect to the server and read message sent by the server and displays the same on the screen as follows −

$perl client.pl
Smile from the server

NOTE − If you are giving the actual IP address in dot notation, then it is recommended to provide IP address in the same format in both client as well as server to avoid any confusion.

We have already studied references in Perl and Perl anonymous arrays and hashes. Object Oriented concept in Perl is very much based on references and anonymous array and hashes. Let's start learning basic concepts of Object Oriented Perl.

Object Basics

There are three main terms, explained from the point of view of how Perl handles objects. The terms are object, class, and method.

  • An object within Perl is merely a reference to a data type that knows what class it belongs to. The object is stored as a reference in a scalar variable. Because a scalar only contains a reference to the object, the same scalar can hold different objects in different classes.

  • A class within Perl is a package that contains the corresponding methods required to create and manipulate objects.

  • A method within Perl is a subroutine, defined with the package. The first argument to the method is an object reference or a package name, depending on whether the method affects the current object or the class.

Perl provides a bless() function, which is used to return a reference which ultimately becomes an object.

Defining a Class

It is very simple to define a class in Perl. A class is corresponding to a Perl Package in its simplest form. To create a class in Perl, we first build a package.

A package is a self-contained unit of user-defined variables and subroutines, which can be re-used over and over again.

Perl Packages provide a separate namespace within a Perl program which keeps subroutines and variables independent from conflicting with those in other packages.

To declare a class named Person in Perl we do −

package Person;

The scope of the package definition extends to the end of the file, or until another package keyword is encountered.

Creating and Using Objects

To create an instance of a class (an object) we need an object constructor. This constructor is a method defined within the package. Most programmers choose to name this object constructor method new, but in Perl you can use any name.

You can use any kind of Perl variable as an object in Perl. Most Perl programmers choose either references to arrays or hashes.

Let's create our constructor for our Person class using a Perl hash reference. When creating an object, you need to supply a constructor, which is a subroutine within a package that returns an object reference. The object reference is created by blessing a reference to the package's class. For example −

package Person;
sub new {
   my $class = shift;
   my $self = { _firstName => shift, _lastName => shift, _ssn => shift, }; # Print all the values just for clarification. print "First Name is $self->{_firstName}\n";
   print "Last Name is $self->{_lastName}\n"; print "SSN is $self->{_ssn}\n";
   bless $self, $class;
   return $self;
}

Now Let us see how to create an Object.

$object = new Person( "Mohammad", "Saleem", 23234345);

You can use simple hash in your consturctor if you don't want to assign any value to any class variable. For example −

package Person;
sub new {
   my $class = shift; my $self = {};
   bless $self, $class;
   return $self;
}

Defining Methods

Other object-oriented languages have the concept of security of data to prevent a programmer from changing an object data directly and they provide accessor methods to modify object data. Perl does not have private variables but we can still use the concept of helper methods to manipulate object data.

Lets define a helper method to get person’s first name −

sub getFirstName {
   return $self->{_firstName};
}

Another helper function to set person’s first name −

sub setFirstName {
   my ( $self, $firstName ) = @_;
   $self->{_firstName} = $firstName if defined($firstName); return $self->{_firstName};
}

Now lets have a look into complete example: Keep Person package and helper functions into Person.pm file.

#!/usr/bin/perl 

package Person;

sub new {
   my $class = shift; my $self = {
      _firstName => shift,
      _lastName  => shift,
      _ssn       => shift,
   };
   # Print all the values just for clarification.
   print "First Name is $self->{_firstName}\n"; print "Last Name is $self->{_lastName}\n";
   print "SSN is $self->{_ssn}\n"; bless $self, $class; return $self;
}
sub setFirstName {
   my ( $self, $firstName ) = @_;
   $self->{_firstName} = $firstName if defined($firstName); return $self->{_firstName};
}

sub getFirstName {
   my( $self ) = @_; return $self->{_firstName};
}
1;

Now let's make use of Person object in employee.pl file as follows −

#!/usr/bin/perl

use Person;

$object = new Person( "Mohammad", "Saleem", 23234345); # Get first name which is set using constructor. $firstName = $object->getFirstName(); print "Before Setting First Name is : $firstName\n";

# Now Set first name using helper function.
$object->setFirstName( "Mohd." ); # Now get first name set by helper function. $firstName = $object->getFirstName(); print "Before Setting First Name is : $firstName\n";

When we execute above program, it produces the following result −

First Name is Mohammad
Last Name is Saleem
SSN is 23234345
Before Setting First Name is : Mohammad
Before Setting First Name is : Mohd.

Inheritance

Object-oriented programming has very good and useful concept called inheritance. Inheritance simply means that properties and methods of a parent class will be available to the child classes. So you don't have to write the same code again and again, you can just inherit a parent class.

For example, we can have a class Employee, which inherits from Person. This is referred to as an "isa" relationship because an employee is a person. Perl has a special variable, @ISA, to help with this. @ISA governs (method) inheritance.

Following are the important points to be considered while using inheritance −

  • Perl searches the class of the specified object for the given method or attribute, i.e., variable.

  • Perl searches the classes defined in the object class's @ISA array.

  • If no method is found in steps 1 or 2, then Perl uses an AUTOLOAD subroutine, if one is found in the @ISA tree.

  • If a matching method still cannot be found, then Perl searches for the method within the UNIVERSAL class (package) that comes as part of the standard Perl library.

  • If the method still has not found, then Perl gives up and raises a runtime exception.

So to create a new Employee class that will inherit methods and attributes from our Person class, we simply code as follows: Keep this code into Employee.pm.

#!/usr/bin/perl

package Employee;
use Person;
use strict;
our @ISA = qw(Person);    # inherits from Person

Now Employee Class has all the methods and attributes inherited from Person class and you can use them as follows: Use main.pl file to test it −

#!/usr/bin/perl

use Employee;

$object = new Employee( "Mohammad", "Saleem", 23234345); # Get first name which is set using constructor. $firstName = $object->getFirstName(); print "Before Setting First Name is : $firstName\n";

# Now Set first name using helper function.
$object->setFirstName( "Mohd." ); # Now get first name set by helper function. $firstName = $object->getFirstName(); print "After Setting First Name is : $firstName\n";

When we execute above program, it produces the following result −

First Name is Mohammad
Last Name is Saleem
SSN is 23234345
Before Setting First Name is : Mohammad
Before Setting First Name is : Mohd.

Method Overriding

The child class Employee inherits all the methods from the parent class Person. But if you would like to override those methods in your child class then you can do it by giving your own implementation. You can add your additional functions in child class or you can add or modify the functionality of an existing methods in its parent class. It can be done as follows: modify Employee.pm file.

#!/usr/bin/perl

package Employee;
use Person;
use strict;
our @ISA = qw(Person);    # inherits from Person

# Override constructor
sub new {
   my ($class) = @_; # Call the constructor of the parent class, Person. my $self = $class->SUPER::new( $_[1], $_[2], $_[3] );
   # Add few more attributes
   $self->{_id} = undef; $self->{_title} = undef;
   bless $self, $class;
   return $self; } # Override helper function sub getFirstName { my( $self ) = @_;
   # This is child class function.
   print "This is child class helper function\n";
   return $self->{_firstName}; } # Add more methods sub setLastName{ my ( $self, $lastName ) = @_; $self->{_lastName} = $lastName if defined($lastName);
   return $self->{_lastName}; } sub getLastName { my( $self ) = @_;
   return $self->{_lastName};
}

1;

Bây giờ, hãy thử sử dụng đối tượng Employee trong tệp main.pl của chúng ta và thực thi nó.

#!/usr/bin/perl

use Employee;

$object = new Employee( "Mohammad", "Saleem", 23234345);
# Get first name which is set using constructor.
$firstName = $object->getFirstName();

print "Before Setting First Name is : $firstName\n"; # Now Set first name using helper function. $object->setFirstName( "Mohd." );

# Now get first name set by helper function.
$firstName = $object->getFirstName();
print "After Setting First Name is : $firstName\n";

Khi chúng ta thực hiện chương trình trên, nó tạo ra kết quả sau:

First Name is Mohammad
Last Name is Saleem
SSN is 23234345
This is child class helper function
Before Setting First Name is : Mohammad
This is child class helper function
After Setting First Name is : Mohd.

Tự động tải mặc định

Perl cung cấp một tính năng mà bạn không thể tìm thấy trong bất kỳ ngôn ngữ lập trình nào khác: một chương trình con mặc định. Có nghĩa là, nếu bạn xác định một hàm được gọi làAUTOLOAD(),thì bất kỳ lệnh gọi nào đến các chương trình con không xác định sẽ tự động gọi hàm AUTOLOAD (). Tên của chương trình con bị thiếu có thể truy cập được trong chương trình con này là $ AUTOLOAD.

Chức năng tự động tải mặc định rất hữu ích để xử lý lỗi. Đây là một ví dụ để thực hiện AUTOLOAD, bạn có thể thực hiện chức năng này theo cách của mình.

sub AUTOLOAD {
   my $self = shift; my $type = ref ($self) || croak "$self is not an object";
   my $field = $AUTOLOAD;
   $field =~ s/.*://; unless (exists $self->{$field}) { croak "$field does not exist in object/class $type"; } if (@_) { return $self->($name) = shift; } else { return $self->($name);
   }
}

Người tiêu hủy và thu gom rác

Nếu bạn đã lập trình bằng lập trình hướng đối tượng trước đây, thì bạn sẽ nhận thức được sự cần thiết phải tạo destructorđể giải phóng bộ nhớ được cấp cho đối tượng khi bạn sử dụng xong. Perl tự động thực hiện việc này cho bạn ngay khi đối tượng vượt ra khỏi phạm vi.

Trong trường hợp bạn muốn triển khai trình hủy của mình, công cụ này sẽ quan tâm đến việc đóng tệp hoặc thực hiện một số xử lý bổ sung thì bạn cần xác định một phương thức đặc biệt được gọi là DESTROY. Phương thức này sẽ được gọi trên đối tượng ngay trước khi Perl giải phóng bộ nhớ được cấp cho nó. Trong tất cả các khía cạnh khác, phương pháp DESTROY cũng giống như bất kỳ phương pháp nào khác và bạn có thể triển khai bất kỳ logic nào bạn muốn bên trong phương thức này.

Phương thức hủy đơn giản là một hàm thành viên (chương trình con) có tên DESTROY, sẽ được gọi tự động trong các trường hợp sau:

  • Khi biến của tham chiếu đối tượng vượt ra khỏi phạm vi.
  • Khi biến của tham chiếu đối tượng là undef-ed.
  • Khi tập lệnh kết thúc
  • Khi trình thông dịch perl kết thúc

Ví dụ, bạn có thể chỉ cần đặt phương thức DESTROY sau vào lớp của bạn:

package MyClass;
...
sub DESTROY {
   print "MyClass::DESTROY called\n";
}

Ví dụ Perl hướng đối tượng

Đây là một ví dụ hay khác, sẽ giúp bạn hiểu các khái niệm hướng đối tượng của Perl. Đặt mã nguồn này vào bất kỳ tệp perl nào và thực thi nó.

#!/usr/bin/perl

# Following is the implementation of simple Class.
package MyClass;

sub new {
   print "MyClass::new called\n";
   my $type = shift;            # The package/type name
   my $self = {}; # Reference to empty hash return bless $self, $type; } sub DESTROY { print "MyClass::DESTROY called\n"; } sub MyMethod { print "MyClass::MyMethod called!\n"; } # Following is the implemnetation of Inheritance. package MySubClass; @ISA = qw( MyClass ); sub new { print "MySubClass::new called\n"; my $type = shift;            # The package/type name
   my $self = MyClass->new; # Reference to empty hash return bless $self, $type; } sub DESTROY { print "MySubClass::DESTROY called\n"; } sub MyMethod { my $self = shift;
   $self->SUPER::MyMethod(); print " MySubClass::MyMethod called!\n"; } # Here is the main program using above classes. package main; print "Invoke MyClass method\n"; $myObject = MyClass->new();
$myObject->MyMethod(); print "Invoke MySubClass method\n"; $myObject2 = MySubClass->new();
$myObject2->MyMethod(); print "Create a scoped object\n"; { my $myObject2 = MyClass->new();
}
# Destructor is called automatically here

print "Create and undef an object\n";
$myObject3 = MyClass->new(); undef $myObject3;

print "Fall off the end of the script...\n";
# Remaining destructors are called automatically here

Khi chúng ta thực hiện chương trình trên, nó tạo ra kết quả sau:

Invoke MyClass method
MyClass::new called
MyClass::MyMethod called!
Invoke MySubClass method
MySubClass::new called
MyClass::new called
MyClass::MyMethod called!
MySubClass::MyMethod called!
Create a scoped object
MyClass::new called
MyClass::DESTROY called
Create and undef an object
MyClass::new called
MyClass::DESTROY called
Fall off the end of the script...
MyClass::DESTROY called
MySubClass::DESTROY called

Chương này hướng dẫn bạn cách truy cập cơ sở dữ liệu bên trong tập lệnh Perl của bạn. Bắt đầu từ Perl 5 đã trở nên rất dễ dàng để viết các ứng dụng cơ sở dữ liệu bằng cách sử dụngDBImô-đun. DBI là viết tắt củaDatabase Independent Interface cho Perl, có nghĩa là DBI cung cấp một lớp trừu tượng giữa mã Perl và cơ sở dữ liệu bên dưới, cho phép bạn chuyển đổi việc triển khai cơ sở dữ liệu thực sự dễ dàng.

DBI là một mô-đun truy cập cơ sở dữ liệu cho ngôn ngữ lập trình Perl. Nó cung cấp một tập hợp các phương thức, biến và quy ước cung cấp giao diện cơ sở dữ liệu nhất quán, độc lập với cơ sở dữ liệu thực tế đang được sử dụng.

Kiến trúc của một ứng dụng DBI

DBI độc lập với bất kỳ cơ sở dữ liệu nào có sẵn trong phần phụ trợ. Bạn có thể sử dụng DBI cho dù bạn đang làm việc với Oracle, MySQL hay Informix, v.v. Điều này rõ ràng từ sơ đồ lưu trữ sau.

Ở đây DBI chịu trách nhiệm nhận tất cả các lệnh SQL thông qua API, (tức là Giao diện lập trình ứng dụng) và gửi chúng đến trình điều khiển thích hợp để thực thi thực tế. Và cuối cùng, DBI chịu trách nhiệm lấy kết quả từ trình điều khiển và trả lại cho scritp đang gọi.

Ký hiệu và Quy ước

Trong suốt chương này, các ký hiệu sau sẽ được sử dụng và bạn nên tuân theo quy ước tương tự.

$dsn Database source name $dbh    Database handle object
$sth Statement handle object $h      Any of the handle types above ($dbh, $sth, or $drh) $rc     General Return Code  (boolean: true=ok, false=error)
$rv General Return Value (typically an integer) @ary List of values returned from the database. $rows   Number of rows processed (if available, else -1)
$fh     A filehandle
undef   NULL values are represented by undefined values in Perl
\%attr  Reference to a hash of attribute values passed to methods

Kết nối cơ sở dữ liệu

Giả sử chúng ta sẽ làm việc với cơ sở dữ liệu MySQL. Trước khi kết nối với cơ sở dữ liệu, hãy đảm bảo những điều sau. Bạn có thể nhận trợ giúp về hướng dẫn MySQL của chúng tôi trong trường hợp bạn không biết về cách tạo cơ sở dữ liệu và bảng trong cơ sở dữ liệu MySQL.

  • Bạn đã tạo một cơ sở dữ liệu với tên TESTDB.

  • Bạn đã tạo một bảng với tên TEST_TABLE trong TESTDB.

  • Bảng này có các trường FIRST_NAME, LAST_NAME, AGE, SEX và INCOME.

  • ID người dùng "testuser" và mật khẩu "test123" được đặt để truy cập TESTDB.

  • Perl Module DBI được cài đặt đúng cách trên máy của bạn.

  • Bạn đã xem qua hướng dẫn MySQL để hiểu Cơ bản về MySQL.

Sau đây là ví dụ về kết nối với cơ sở dữ liệu MySQL "TESTDB" -

#!/usr/bin/perl

use DBI
use strict;

my $driver = "mysql"; 
my $database = "TESTDB"; my $dsn = "DBI:$driver:database=$database";
my $userid = "testuser"; my $password = "test123";

my $dbh = DBI->connect($dsn, $userid, $password ) or die $DBI::errstr;

Nếu kết nối được thiết lập với nguồn dữ liệu thì Xử lý cơ sở dữ liệu sẽ được trả về và lưu vào $ dbh để sử dụng thêm, nếu không thì $ dbh được đặt thành giá trị undef và $ DBI :: errstr trả về một chuỗi lỗi.

INSERT hoạt động

Thao tác INSERT là bắt buộc khi bạn muốn tạo một số bản ghi vào bảng. Ở đây chúng tôi đang sử dụng bảng TEST_TABLE để tạo bản ghi của chúng tôi. Vì vậy, khi kết nối cơ sở dữ liệu của chúng tôi được thiết lập, chúng tôi đã sẵn sàng tạo các bản ghi vào TEST_TABLE. Sau đây là quy trình để tạo một bản ghi vào TEST_TABLE. Bạn có thể tạo bao nhiêu bản ghi mà bạn muốn bằng cách sử dụng cùng một khái niệm.

Việc tạo bản ghi thực hiện theo các bước sau:

  • Chuẩn bị câu lệnh SQL với câu lệnh INSERT. Điều này sẽ được thực hiện bằng cách sử dụngprepare() API.

  • Thực thi truy vấn SQL để chọn tất cả các kết quả từ cơ sở dữ liệu. Điều này sẽ được thực hiện bằng cách sử dụngexecute() API.

  • Phát hành tay cầm Stattement. Điều này sẽ được thực hiện bằng cách sử dụngfinish() API.

  • Nếu mọi thứ suôn sẻ thì commit hoạt động này nếu không bạn có thể rollbackhoàn thành giao dịch. Cam kết và Khôi phục được giải thích trong các phần tiếp theo.

my $sth = $dbh->prepare("INSERT INTO TEST_TABLE
                       (FIRST_NAME, LAST_NAME, SEX, AGE, INCOME )
                         values
                       ('john', 'poul', 'M', 30, 13000)");
$sth->execute() or die $DBI::errstr;
$sth->finish(); $dbh->commit or die $DBI::errstr;

Sử dụng giá trị ràng buộc

Có thể có một trường hợp khi các giá trị cần nhập không được cung cấp trước. Vì vậy, bạn có thể sử dụng các biến ràng buộc sẽ nhận các giá trị cần thiết tại thời gian chạy. Các mô-đun Perl DBI sử dụng dấu chấm hỏi thay cho giá trị thực và sau đó giá trị thực được chuyển qua API execute () tại thời điểm chạy. Sau đây là ví dụ -

my $first_name = "john";
my $last_name = "poul"; my $sex = "M";
my $income = 13000; my $age = 30;
my $sth = $dbh->prepare("INSERT INTO TEST_TABLE
                        (FIRST_NAME, LAST_NAME, SEX, AGE, INCOME )
                          values
                        (?,?,?,?)");
$sth->execute($first_name,$last_name,$sex, $age, $income) 
          or die $DBI::errstr; $sth->finish();
$dbh->commit or die $DBI::errstr;

ĐỌC hoạt động

ĐỌC Hoạt động trên bất kỳ cơ sở dữ liệu nào có nghĩa là lấy một số thông tin hữu ích từ cơ sở dữ liệu, tức là, một hoặc nhiều bản ghi từ một hoặc nhiều bảng. Vì vậy, khi kết nối cơ sở dữ liệu của chúng tôi được thiết lập, chúng tôi đã sẵn sàng thực hiện truy vấn vào cơ sở dữ liệu này. Sau đây là thủ tục để truy vấn tất cả các bản ghi có AGE lớn hơn 20. Việc này sẽ thực hiện bốn bước:

  • Chuẩn bị truy vấn SQL SELECT dựa trên các điều kiện bắt buộc. Điều này sẽ được thực hiện bằng cách sử dụngprepare() API.

  • Thực thi truy vấn SQL để chọn tất cả các kết quả từ cơ sở dữ liệu. Điều này sẽ được thực hiện bằng cách sử dụngexecute() API.

  • Tìm nạp lần lượt tất cả các kết quả và in ra các kết quả đó. Điều này sẽ được thực hiện bằng cách sử dụng fetchrow_array() API.

  • Phát hành tay cầm Stattement. Điều này sẽ được thực hiện bằng cách sử dụngfinish() API.

my $sth = $dbh->prepare("SELECT FIRST_NAME, LAST_NAME
                        FROM TEST_TABLE 
                        WHERE AGE > 20");
$sth->execute() or die $DBI::errstr;
print "Number of rows found :" + $sth->rows; while (my @row = $sth->fetchrow_array()) {
   my ($first_name, $last_name ) = @row;
   print "First Name = $first_name, Last Name = $last_name\n";
}
$sth->finish();

Sử dụng giá trị ràng buộc

Có thể có một trường hợp khi điều kiện không được đưa ra trước. Vì vậy, bạn có thể sử dụng các biến ràng buộc, các biến này sẽ nhận các giá trị cần thiết tại thời điểm chạy. Các mô-đun Perl DBI sử dụng dấu chấm hỏi thay cho giá trị thực và sau đó các giá trị thực được chuyển qua API execute () tại thời điểm chạy. Sau đây là ví dụ -

$age = 20;
my $sth = $dbh->prepare("SELECT FIRST_NAME, LAST_NAME
                        FROM TEST_TABLE
                        WHERE AGE > ?");
$sth->execute( $age ) or die $DBI::errstr; print "Number of rows found :" + $sth->rows;
while (my @row = $sth->fetchrow_array()) { my ($first_name, $last_name ) = @row; print "First Name = $first_name, Last Name = $last_name\n"; } $sth->finish();

CẬP NHẬT Hoạt động

CẬP NHẬT Hoạt động trên bất kỳ cơ sở dữ liệu nào có nghĩa là cập nhật một hoặc nhiều bản ghi đã có sẵn trong bảng cơ sở dữ liệu. Sau đây là thủ tục để cập nhật tất cả các bản ghi có SEX là 'M'. Ở đây, chúng tôi sẽ tăng TUỔI của tất cả nam giới thêm một năm. Điều này sẽ thực hiện ba bước -

  • Chuẩn bị truy vấn SQL dựa trên các điều kiện bắt buộc. Điều này sẽ được thực hiện bằng cách sử dụngprepare() API.

  • Thực thi truy vấn SQL để chọn tất cả các kết quả từ cơ sở dữ liệu. Điều này sẽ được thực hiện bằng cách sử dụngexecute() API.

  • Phát hành tay cầm Stattement. Điều này sẽ được thực hiện bằng cách sử dụngfinish() API.

  • Nếu mọi thứ suôn sẻ thì commit hoạt động này nếu không bạn có thể rollbackhoàn thành giao dịch. Xem phần tiếp theo để biết các API cam kết và khôi phục.

my $sth = $dbh->prepare("UPDATE TEST_TABLE
                        SET   AGE = AGE + 1 
                        WHERE SEX = 'M'");
$sth->execute() or die $DBI::errstr;
print "Number of rows updated :" + $sth->rows; $sth->finish();
$dbh->commit or die $DBI::errstr;

Sử dụng giá trị ràng buộc

Có thể có một trường hợp khi điều kiện không được đưa ra trước. Vì vậy, bạn có thể sử dụng các biến ràng buộc, các biến này sẽ nhận các giá trị bắt buộc tại thời điểm chạy. Các mô-đun Perl DBI sử dụng dấu chấm hỏi thay cho giá trị thực và sau đó giá trị thực được chuyển qua API execute () tại thời điểm chạy. Sau đây là ví dụ -

$sex = 'M'; my $sth = $dbh->prepare("UPDATE TEST_TABLE SET AGE = AGE + 1 WHERE SEX = ?"); $sth->execute('$sex') or die $DBI::errstr;
print "Number of rows updated :" + $sth->rows; $sth->finish();
$dbh->commit or die $DBI::errstr;

Trong một số trường hợp, bạn muốn đặt một giá trị, giá trị này không được cung cấp trước để bạn có thể sử dụng giá trị ràng buộc như sau. Trong ví dụ này, thu nhập của tất cả nam giới sẽ được đặt thành 10000.

$sex = 'M'; $income = 10000;
my $sth = $dbh->prepare("UPDATE TEST_TABLE
                        SET   INCOME = ?
                        WHERE SEX = ?");
$sth->execute( $income, '$sex') or die $DBI::errstr;
print "Number of rows updated :" + $sth->rows; $sth->finish();

Thao tác DELETE

Thao tác DELETE là bắt buộc khi bạn muốn xóa một số bản ghi khỏi cơ sở dữ liệu của mình. Sau đây là thủ tục để xóa tất cả các bản ghi khỏi TEST_TABLE trong đó AGE bằng 30. Thao tác này sẽ thực hiện các bước sau.

  • Chuẩn bị truy vấn SQL dựa trên các điều kiện bắt buộc. Điều này sẽ được thực hiện bằng cách sử dụngprepare() API.

  • Thực thi truy vấn SQL để xóa các bản ghi được yêu cầu khỏi cơ sở dữ liệu. Điều này sẽ được thực hiện bằng cách sử dụngexecute() API.

  • Phát hành tay cầm Stattement. Điều này sẽ được thực hiện bằng cách sử dụngfinish() API.

  • Nếu mọi thứ suôn sẻ thì commit hoạt động này nếu không bạn có thể rollback hoàn thành giao dịch.

$age = 30; my $sth = $dbh->prepare("DELETE FROM TEST_TABLE WHERE AGE = ?"); $sth->execute( $age ) or die $DBI::errstr;
print "Number of rows deleted :" + $sth->rows; $sth->finish();
$dbh->commit or die $DBI::errstr;

Sử dụng do Statement

Nếu bạn đang thực hiện CẬP NHẬT, CHÈN hoặc XÓA, không có dữ liệu nào quay trở lại từ cơ sở dữ liệu, vì vậy cần có một bước ngắn để thực hiện thao tác này. Bạn có thể dùngdo để thực hiện bất kỳ lệnh nào như sau.

$dbh->do('DELETE FROM TEST_TABLE WHERE age =30');

dotrả về một giá trị true nếu nó thành công và một giá trị false nếu nó không thành công. Trên thực tế, nếu nó thành công, nó trả về số hàng bị ảnh hưởng. Trong ví dụ này, nó sẽ trả về số hàng đã thực sự bị xóa.

Hoạt động CAM KẾT

Cam kết là hoạt động đưa ra một tín hiệu xanh cho cơ sở dữ liệu để hoàn thành các thay đổi và sau hoạt động này, không có thay đổi nào có thể được hoàn nguyên về vị trí ban đầu của nó.

Đây là một ví dụ đơn giản để gọi commit API.

$dbh->commit or die $dbh->errstr;

Hoạt động ROLLBACK

Nếu bạn không hài lòng với tất cả các thay đổi hoặc gặp lỗi giữa bất kỳ thao tác nào, bạn có thể hoàn nguyên các thay đổi đó để sử dụng rollback API.

Đây là một ví dụ đơn giản để gọi rollback API.

$dbh->rollback or die $dbh->errstr;

Bắt đầu giao dịch

Nhiều cơ sở dữ liệu hỗ trợ giao dịch. Điều này có nghĩa là bạn có thể thực hiện một loạt các truy vấn sẽ sửa đổi cơ sở dữ liệu, nhưng không có thay đổi nào thực sự được thực hiện. Sau đó, ở cuối, bạn đưa ra truy vấn SQL đặc biệtCOMMITvà tất cả các thay đổi được thực hiện đồng thời. Ngoài ra, bạn có thể đưa ra truy vấn ROLLBACK, trong trường hợp này, tất cả các thay đổi sẽ bị loại bỏ và cơ sở dữ liệu vẫn không thay đổi.

Mô-đun Perl DBI được cung cấp begin_workAPI, cho phép các giao dịch (bằng cách tắt Tự động gửi) cho đến lần gọi tiếp theo để cam kết hoặc khôi phục. Sau lần cam kết hoặc khôi phục tiếp theo, AutoCommit sẽ tự động được bật lại.

$rc  = $dbh->begin_work or die $dbh->errstr;

Tùy chọn AutoCommit

Nếu các giao dịch của bạn đơn giản, bạn có thể tránh được rắc rối khi phải phát hành nhiều cam kết. Khi thực hiện cuộc gọi kết nối, bạn có thể chỉ định mộtAutoCommittùy chọn này sẽ thực hiện thao tác cam kết tự động sau mỗi lần truy vấn thành công. Đây là những gì nó trông như thế này -

my $dbh = DBI->connect($dsn, $userid, $password,
              {AutoCommit => 1}) 
              or die $DBI::errstr;

Ở đây AutoCommit có thể nhận giá trị 1 hoặc 0, trong đó 1 có nghĩa là AutoCommit đang bật và 0 có nghĩa là AutoCommit đang tắt.

Xử lý lỗi tự động

Khi bạn thực hiện cuộc gọi kết nối, bạn có thể chỉ định tùy chọn RaiseErrors để tự động xử lý lỗi cho bạn. Khi xảy ra lỗi, DBI sẽ hủy bỏ chương trình của bạn thay vì trả về mã lỗi. Nếu tất cả những gì bạn muốn là hủy bỏ chương trình do lỗi, điều này có thể thuận tiện. Đây là những gì nó trông như thế này -

my $dbh = DBI->connect($dsn, $userid, $password, {RaiseError => 1}) or die $DBI::errstr;

Ở đây RaiseError có thể nhận giá trị 1 hoặc 0.

Ngắt kết nối cơ sở dữ liệu

Để ngắt kết nối Cơ sở dữ liệu, hãy sử dụng disconnect API như sau -

$rc = $dbh->disconnect  or warn $dbh->errstr;

Thật đáng buồn là hành vi giao dịch của phương thức ngắt kết nối là không xác định. Một số hệ thống cơ sở dữ liệu (chẳng hạn như Oracle và Ingres) sẽ tự động cam kết bất kỳ thay đổi nổi bật nào, nhưng những hệ thống khác (chẳng hạn như Informix) sẽ khôi phục mọi thay đổi chưa xuất hiện. Các ứng dụng không sử dụng AutoCommit nên gọi cam kết hoặc khôi phục rõ ràng trước khi gọi ngắt kết nối.

Sử dụng giá trị NULL

Giá trị không xác định, hoặc không xác định, được sử dụng để chỉ ra giá trị NULL. Bạn có thể chèn và cập nhật các cột có giá trị NULL như cách bạn làm với giá trị không phải NULL. Các ví dụ này chèn và cập nhật tuổi cột với giá trị NULL -

$sth = $dbh->prepare(qq { INSERT INTO TEST_TABLE (FIRST_NAME, AGE) VALUES (?, ?) }); $sth->execute("Joe", undef);

Đây qq{} được sử dụng để trả về một chuỗi được trích dẫn tới prepareAPI. Tuy nhiên, phải cẩn thận khi cố gắng sử dụng giá trị NULL trong mệnh đề WHERE. Hãy xem xét -

SELECT FIRST_NAME FROM TEST_TABLE WHERE age = ?

Việc ràng buộc undef (NULL) với trình giữ chỗ sẽ không chọn các hàng có tuổi NULL! Ít nhất là đối với các công cụ cơ sở dữ liệu phù hợp với tiêu chuẩn SQL. Tham khảo hướng dẫn sử dụng SQL cho công cụ cơ sở dữ liệu của bạn hoặc bất kỳ cuốn sách SQL nào để biết lý do cho việc này. Để chọn rõ ràng NULL, bạn phải nói "WHERE age IS NULL".

Một vấn đề phổ biến là có một đoạn mã xử lý một giá trị có thể được xác định hoặc không xác định (không phải NULL hoặc NULL) trong thời gian chạy. Một kỹ thuật đơn giản là chuẩn bị câu lệnh thích hợp nếu cần và thay thế trình giữ chỗ cho các trường hợp không phải NULL -

$sql_clause = defined $age? "age = ?" : "age IS NULL";
$sth = $dbh->prepare(qq {
         SELECT FIRST_NAME FROM TEST_TABLE WHERE $sql_clause }); $sth->execute(defined $age ? $age : ());

Một số chức năng khác của DBI

ready_drivers

@ary = DBI->available_drivers;
@ary = DBI->available_drivers($quiet);

Trả về danh sách tất cả các trình điều khiển có sẵn bằng cách tìm kiếm các mô-đun DBD :: * thông qua các thư mục trong @INC. Theo mặc định, một cảnh báo được đưa ra nếu một số trình điều khiển bị ẩn bởi những người khác cùng tên trong các thư mục trước đó. Việc vượt qua giá trị thực cho $ lặng sẽ ngăn cản cảnh báo.

install_drivers

%drivers = DBI->installed_drivers();

Trả về danh sách tên trình điều khiển và cặp xử lý trình điều khiển cho tất cả các trình điều khiển được 'cài đặt' (đã tải) vào quy trình hiện tại. Tên trình điều khiển không bao gồm tiền tố 'DBD ::'.

nguồn dữ liệu

@ary = DBI->data_sources($driver);

Trả về danh sách các nguồn dữ liệu (cơ sở dữ liệu) có sẵn thông qua trình điều khiển được đặt tên. Nếu $ trình điều khiển trống hoặc không xác định, thì giá trị của biến môi trường DBI_DRIVER được sử dụng.

Trích dẫn

$sql = $dbh->quote($value); $sql = $dbh->quote($value, $data_type);

Trích dẫn một chuỗi ký tự để sử dụng như một giá trị ký tự trong một câu lệnh SQL, bằng cách thoát bất kỳ ký tự đặc biệt nào (chẳng hạn như dấu ngoặc kép) có trong chuỗi và thêm loại dấu ngoặc kép bên ngoài được yêu cầu.

$sql = sprintf "SELECT foo FROM bar WHERE baz = %s",
                $dbh->quote("Don't");

Đối với hầu hết các loại cơ sở dữ liệu, trích dẫn sẽ trả về 'Không' (bao gồm cả dấu ngoặc kép bên ngoài). Phương thức quote () trả về một biểu thức SQL đánh giá thành chuỗi mong muốn là hợp lệ. Ví dụ -

$quoted = $dbh->quote("one\ntwo\0three")

may produce results which will be equivalent to

CONCAT('one', CHAR(12), 'two', CHAR(0), 'three')

Các phương pháp chung cho tất cả các xử lý

sai lầm

$rv = $h->err; or $rv = $DBI::err or $rv = $h->err

Trả về mã lỗi công cụ cơ sở dữ liệu gốc từ phương thức trình điều khiển cuối cùng được gọi. Mã thường là một số nguyên nhưng bạn không nên cho rằng điều đó. Điều này tương đương với $ DBI :: err hoặc $ h-> err.

errstr

$str = $h->errstr; or $str = $DBI::errstr or $str = $h->errstr

Trả về thông báo lỗi công cụ cơ sở dữ liệu gốc từ phương thức DBI cuối cùng được gọi. Điều này có các vấn đề về tuổi thọ tương tự như phương pháp "err" được mô tả ở trên. Điều này tương đương với $ DBI :: errstr hoặc $ h-> errstr.

hàng

$rv = $h->rows; or $rv = $DBI::rows

Điều này trả về số hàng được thực hiện bởi câu lệnh SQL trước đó và tương đương với $ DBI :: các hàng.

dấu vết

$h->trace($trace_settings);

DBI có khả năng cực kỳ hữu ích để tạo thông tin theo dõi thời gian chạy về những gì nó đang làm, có thể tiết kiệm thời gian rất lớn khi cố gắng theo dõi các vấn đề lạ trong chương trình DBI của bạn. Bạn có thể sử dụng các giá trị khác nhau để đặt mức theo dõi. Các giá trị này thay đổi từ 0 đến 4. Giá trị 0 có nghĩa là vô hiệu hóa dấu vết và 4 có nghĩa là tạo dấu vết hoàn chỉnh.

Các tuyên bố nội suy bị cấm

Chúng tôi rất khuyến khích không sử dụng các câu lệnh nội suy như sau:

while ($first_name = <>) { my $sth = $dbh->prepare("SELECT * FROM TEST_TABLE WHERE FIRST_NAME = '$first_name'");
   $sth->execute();
   # and so on ...
}

Do đó, không sử dụng câu lệnh nội suy thay vào đó hãy sử dụng bind value để chuẩn bị câu lệnh SQL động.

CGI là gì?

  • Giao diện cổng chung, hay CGI, là một tập hợp các tiêu chuẩn xác định cách thông tin được trao đổi giữa máy chủ web và tập lệnh tùy chỉnh.

  • Các thông số kỹ thuật CGI hiện được duy trì bởi NCSA và NCSA định nghĩa CGI như sau:

  • Giao diện cổng chung, hoặc CGI, là một tiêu chuẩn cho các chương trình cổng bên ngoài để giao tiếp với các máy chủ thông tin như máy chủ HTTP.

  • Phiên bản hiện tại là CGI / 1.1 và CGI / 1.2 đang được hoàn thiện.

Duyệt web

Để hiểu khái niệm về CGI, hãy xem điều gì sẽ xảy ra khi chúng ta nhấp vào một siêu liên kết có sẵn trên một trang web để duyệt một trang web hoặc URL cụ thể.

  • Trình duyệt của bạn liên hệ với máy chủ web bằng giao thức HTTP và yêu cầu URL, tức là tên tệp trang web.

  • Máy chủ Web sẽ kiểm tra URL và sẽ tìm kiếm tên tệp được yêu cầu. Nếu máy chủ web tìm thấy tệp đó thì nó sẽ gửi tệp đó trở lại trình duyệt mà không cần thực hiện thêm nữa, nếu không sẽ gửi thông báo lỗi cho biết rằng bạn đã yêu cầu tệp sai.

  • Trình duyệt web nhận phản hồi từ máy chủ web và hiển thị nội dung tệp đã nhận hoặc thông báo lỗi trong trường hợp không tìm thấy tệp.

Tuy nhiên, có thể thiết lập máy chủ HTTP theo cách sao cho bất cứ khi nào tệp trong một thư mục nhất định được yêu cầu, tệp đó sẽ không được gửi lại; thay vào đó, nó được thực thi như một chương trình và bất kỳ kết quả nào mà chương trình đó xuất ra, đều được gửi lại để trình duyệt của bạn hiển thị. Điều này có thể được thực hiện bằng cách sử dụng một chức năng đặc biệt có sẵn trong máy chủ web và nó được gọi làCommon Gateway Interfacehoặc CGI và các chương trình như vậy được thực thi bởi máy chủ để tạo ra kết quả cuối cùng, được gọi là tập lệnh CGI. Các chương trình CGI này có thể là PERL Script, Shell Script, chương trình C hoặc C ++, v.v.

Sơ đồ kiến ​​trúc CGI

Hỗ trợ và cấu hình máy chủ web

Trước khi bạn tiếp tục Lập trình CGI, hãy đảm bảo rằng Máy chủ Web của bạn hỗ trợ chức năng CGI và nó được cấu hình để xử lý các chương trình CGI. Tất cả các chương trình CGI được thực thi bởi máy chủ web được lưu giữ trong một thư mục được cấu hình trước. Thư mục này được gọi là thư mục CGI và theo quy ước, nó được đặt tên là / cgi-bin. Theo quy ước, các tệp Perl CGI sẽ có phần mở rộng là.cgi.

Chương trình CGI đầu tiên

Đây là một liên kết đơn giản được liên kết với tập lệnh CGI có tên là hello.cgi . Tệp này đã được giữ trong/cgi-bin/thư mục và nó có nội dung sau. Trước khi chạy chương trình CGI, hãy đảm bảo rằng bạn đã thay đổi chế độ tệp bằng cách sử dụngchmod 755 hello.cgi Lệnh UNIX.

#!/usr/bin/perl

print "Content-type:text/html\r\n\r\n";
print '<html>';
print '<head>';
print '<title>Hello Word - First CGI Program</title>';
print '</head>';
print '<body>';
print '<h2>Hello Word! This is my first CGI program</h2>';
print '</body>';
print '</html>';

1;

Bây giờ nếu bạn nhấp vào hello.cgi liên kết sau đó yêu cầu chuyển đến máy chủ web tìm kiếm hello.cgi trong thư mục / cgi-bin, thực thi nó và bất kỳ kết quả nào được tạo ra, máy chủ web sẽ gửi kết quả đó trở lại trình duyệt web, như sau:

Hello Word! This is my first CGI program

Tập lệnh hello.cgi này là một tập lệnh Perl đơn giản đang ghi đầu ra của nó trên tệp STDOUT, tức là màn hình. Có một tính năng quan trọng và bổ sung có sẵn đó là dòng đầu tiên được inContent-type:text/html\r\n\r\n. Dòng này được gửi trở lại trình duyệt và chỉ định loại nội dung sẽ hiển thị trên màn hình trình duyệt. Bây giờ bạn phải có khái niệm cơ bản về CGI và bạn có thể viết nhiều chương trình CGI phức tạp bằng Perl. Tập lệnh này có thể tương tác với bất kỳ hệ thống thực thi nào khác cũng để trao đổi thông tin như cơ sở dữ liệu, dịch vụ web hoặc bất kỳ giao diện phức tạp nào khác.

Hiểu tiêu đề HTTP

Dòng đầu tiên Content-type:text/html\r\n\r\nlà một phần của tiêu đề HTTP, được gửi tới trình duyệt để trình duyệt có thể hiểu nội dung đến từ phía máy chủ. Tất cả tiêu đề HTTP sẽ ở dạng sau:

HTTP Field Name: Field Content

Ví dụ -

Content-type:text/html\r\n\r\n

Có một số tiêu đề HTTP quan trọng khác mà bạn sẽ sử dụng thường xuyên trong Lập trình CGI của mình.

Sr.No. Tiêu đề & Mô tả
1

Content-type: String

Một chuỗi MIME xác định định dạng của nội dung được trả về. Ví dụ là Content-type: text / html

2

Expires: Date String

Ngày mà thông tin trở nên không hợp lệ. Điều này sẽ được sử dụng bởi trình duyệt để quyết định khi nào một trang cần được làm mới. Chuỗi ngày hợp lệ phải có định dạng 01/01/1998 12:00:00 GMT.

3

Location: URL String

URL sẽ được trả lại thay vì URL được yêu cầu. Bạn có thể sử dụng tệp này để chuyển hướng yêu cầu đến bất kỳ vị trí nào khác.

4

Last-modified: String

Ngày sửa đổi cuối cùng của tệp.

5

Content-length: String

Độ dài, tính bằng byte, của dữ liệu được trả về. Trình duyệt sử dụng giá trị này để báo cáo thời gian tải xuống ước tính cho một tệp.

6

Set-Cookie: String

Đặt cookie được chuyển qua chuỗi

Biến môi trường CGI

Tất cả chương trình CGI sẽ có quyền truy cập vào các biến môi trường sau. Các biến này đóng một vai trò quan trọng trong khi viết bất kỳ chương trình CGI nào.

Sr.No. Tên và mô tả biến
1

CONTENT_TYPE

Kiểu dữ liệu của nội dung. Được sử dụng khi máy khách đang gửi nội dung đính kèm đến máy chủ. Ví dụ: tải lên tệp, v.v.

2

CONTENT_LENGTH

Độ dài của thông tin truy vấn. Nó chỉ có sẵn cho các yêu cầu ĐĂNG

3

HTTP_COOKIE

Trả về các cookie đã đặt ở dạng cặp khóa & giá trị.

4

HTTP_USER_AGENT

Trường tiêu đề yêu cầu Tác nhân người dùng chứa thông tin về tác nhân người dùng khởi tạo yêu cầu. Tên của trình duyệt web.

5

PATH_INFO

Đường dẫn cho tập lệnh CGI.

6

QUERY_STRING

Thông tin mã hóa URL được gửi với yêu cầu phương thức GET.

7

REMOTE_ADDR

Địa chỉ IP của máy chủ từ xa thực hiện yêu cầu. Điều này có thể hữu ích cho việc ghi nhật ký hoặc cho mục đích xác thực.

số 8

REMOTE_HOST

Tên đầy đủ của máy chủ thực hiện yêu cầu. Nếu thông tin này không có sẵn thì REMOTE_ADDR có thể được sử dụng để lấy địa chỉ IR.

9

REQUEST_METHOD

Phương pháp được sử dụng để thực hiện yêu cầu. Các phương pháp phổ biến nhất là GET và POST.

10

SCRIPT_FILENAME

Đường dẫn đầy đủ đến tập lệnh CGI.

11

SCRIPT_NAME

Tên của tập lệnh CGI.

12

SERVER_NAME

Tên máy chủ hoặc Địa chỉ IP của máy chủ.

13

SERVER_SOFTWARE

Tên và phiên bản của phần mềm mà máy chủ đang chạy.

Đây là một chương trình CGI nhỏ để liệt kê tất cả các biến CGI được hỗ trợ bởi máy chủ Web của bạn. Nhấp vào liên kết này để xem kết quả Nhận môi trường

#!/usr/bin/perl

print "Content-type: text/html\n\n";
print "<font size=+1>Environment</font>\n";
foreach (sort keys %ENV) {
   print "<b>$_</b>: $ENV{$_}<br>\n";
}

1;

Tăng Hộp thoại "Tải xuống tệp"?

Đôi khi bạn muốn cung cấp tùy chọn trong đó người dùng sẽ nhấp vào liên kết và nó sẽ bật lên hộp thoại "Tải xuống tệp" cho người dùng thay vì hiển thị nội dung thực tế. Điều này rất dễ dàng và sẽ được thực hiện thông qua tiêu đề HTTP.

Tiêu đề HTTP này sẽ khác với tiêu đề được đề cập trong phần trước. Ví dụ: nếu bạn muốn tạo mộtFileName tệp có thể tải xuống từ một liên kết nhất định thì cú pháp của nó sẽ như sau:

#!/usr/bin/perl

# HTTP Header
print "Content-Type:application/octet-stream; name = \"FileName\"\r\n";
print "Content-Disposition: attachment; filename = \"FileName\"\r\n\n";

# Actual File Content will go hear.
open( FILE, "<FileName" );
while(read(FILE, $buffer, 100) ) { print("$buffer");
}

Phương thức GET và POST

Bạn hẳn đã gặp nhiều tình huống khi bạn cần chuyển một số thông tin từ trình duyệt của mình đến máy chủ web và cuối cùng là Chương trình CGI xử lý các yêu cầu của bạn. Thông thường nhất, trình duyệt sử dụng hai phương pháp để chuyển thông tin này đến máy chủ web. Những phương pháp này làGET Phương pháp và POSTPhương pháp. Hãy kiểm tra từng cái một.

Truyền thông tin bằng phương pháp GET

Phương thức GET gửi thông tin người dùng đã mã hóa được thêm vào chính URL trang. Trang và thông tin được mã hóa được phân tách bằng dấu? nhân vật như sau -

http://www.test.com/cgi-bin/hello.cgi?key1=value1&key2=value2

Phương thức GET là phương thức defualt để truyền thông tin từ trình duyệt đến máy chủ web và nó tạo ra một chuỗi dài xuất hiện trong hộp Location: của trình duyệt của bạn. Bạn không bao giờ được sử dụng phương thức GET nếu bạn có mật khẩu hoặc thông tin nhạy cảm khác để chuyển đến máy chủ. Phương thức GET có giới hạn về kích thước: chỉ có thể chuyển 1024 ký tự trong một chuỗi yêu cầu.

Thông tin này được chuyển bằng cách sử dụng QUERY_STRING và sẽ có thể truy cập được trong Chương trình CGI của bạn thông qua biến môi trường QUERY_STRING mà bạn có thể phân tích cú pháp và sử dụng trong chương trình CGI của mình.

Bạn có thể chuyển thông tin bằng cách chỉ cần nối các cặp khóa và giá trị cùng với bất kỳ URL nào hoặc bạn có thể sử dụng thẻ HTML <FORM> để chuyển thông tin bằng phương thức GET.

Ví dụ về URL đơn giản: Phương thức lấy

Đây là một URL đơn giản sẽ chuyển hai giá trị đến chương trình hello_get.cgi bằng phương thức GET.

http://www.tutorialspoint.com/cgi-bin/hello_get.cgi?first_name=ZARA&last_name=ALI

Dưới là hello_get.cgi script để xử lý đầu vào do trình duyệt web cung cấp.

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/; if ($ENV{'REQUEST_METHOD'} eq "GET") {
   $buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer); foreach $pair (@pairs) {
   ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value; } $first_name = $FORM{first_name}; $last_name  = $FORM{last_name}; print "Content-type:text/html\r\n\r\n"; print "<html>"; print "<head>"; print "<title>Hello - Second CGI Program</title>"; print "</head>"; print "<body>"; print "<h2>Hello $first_name $last_name - Second CGI Program</h2>";
print "</body>";
print "</html>";

1;

MẪU đơn giản Ví dụ: Phương pháp GET

Đây là một ví dụ đơn giản, chuyển hai giá trị bằng HTML FORM và nút gửi. Chúng tôi sẽ sử dụng cùng một tập lệnh CGI hello_get.cgi để xử lý đầu vào này.

<FORM action = "/cgi-bin/hello_get.cgi" method = "GET">
First Name: <input type = "text" name = "first_name">  <br>

Last Name: <input type = "text" name = "last_name">
<input type = "submit" value = "Submit">
</FORM>

Đây là kết quả thực tế của mã hóa biểu mẫu trên. Bây giờ bạn có thể nhập Họ và Tên rồi nhấn nút gửi để xem kết quả.

Truyền thông tin bằng phương pháp POST

Một phương pháp đáng tin cậy hơn để chuyển thông tin đến chương trình CGI là POSTphương pháp. Điều này đóng gói thông tin theo cách giống hệt như các phương thức GET, nhưng thay vì gửi nó dưới dạng một chuỗi văn bản sau?trong URL, nó sẽ gửi nó dưới dạng một thông điệp riêng biệt như một phần của tiêu đề HTTP. Máy chủ web cung cấp thông báo này cho tập lệnh CGI dưới dạng đầu vào chuẩn.

Dưới đây là sửa đổi hello_post.cgiscript để xử lý đầu vào do trình duyệt web cung cấp. Tập lệnh này sẽ xử lý GET cũng như phương thức POST.

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM); # Read in text $ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } # Split information into name/value pairs @pairs = split(/&/, $buffer);
foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /; $value =~ s/%(..)/pack("C", hex($1))/eg; $FORM{$name} = $value;
}
$first_name = $FORM{first_name};
$last_name = $FORM{last_name};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Hello - Second CGI Program</title>";
print "</head>";
print "<body>";
print "<h2>Hello $first_name $last_name - Second CGI Program</h2>";
print "</body>";
print "</html>";

1;

Hãy để chúng tôi thực hiện lại bài kiểm tra tương tự như trên, chuyển hai giá trị bằng HTML FORM và nút gửi. Chúng tôi sẽ sử dụng tập lệnh CGI hello_post.cgi để xử lý đầu vào này.

<FORM action = "/cgi-bin/hello_post.cgi" method = "POST">
First Name: <input type = "text" name = "first_name">  <br>

Last Name: <input type = "text" name = "last_name">

<input type = "submit" value = "Submit">
</FORM>

Đây là kết quả thực tế của việc mã hóa biểu mẫu trên, Bạn nhập Họ và Tên rồi nhấn nút gửi để xem kết quả.

Chuyển dữ liệu hộp kiểm sang chương trình CGI

Hộp kiểm được sử dụng khi bắt buộc phải chọn nhiều tùy chọn. Đây là một mã HTML mẫu cho một biểu mẫu có hai hộp kiểm.

<form action = "/cgi-bin/checkbox.cgi" method = "POST" target = "_blank">
<input type = "checkbox" name = "maths" value = "on"> Maths
<input type = "checkbox" name = "physics" value = "on"> Physics
<input type = "submit" value = "Select Subject">
</form>

Kết quả của mã này là dạng sau:

Dưới là checkbox.cgi script để xử lý đầu vào do trình duyệt web cung cấp cho nút radio.

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/; if ($ENV{'REQUEST_METHOD'} eq "POST") {
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
   $buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer); foreach $pair (@pairs) {
   ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value; } if( $FORM{maths} ) {
   $maths_flag ="ON"; } else { $maths_flag ="OFF";
}
if( $FORM{physics} ) { $physics_flag ="ON";
} else {
   $physics_flag ="OFF"; } print "Content-type:text/html\r\n\r\n"; print "<html>"; print "<head>"; print "<title>Checkbox - Third CGI Program</title>"; print "</head>"; print "<body>"; print "<h2> CheckBox Maths is : $maths_flag</h2>";
print "<h2> CheckBox Physics is : $physics_flag</h2>";
print "</body>";
print "</html>";

1;

Truyền dữ liệu nút radio sang chương trình CGI

Các nút Radio được sử dụng khi chỉ cần chọn một tùy chọn. Đây là mã HTML mẫu cho biểu mẫu có hai nút radio -

<form action = "/cgi-bin/radiobutton.cgi" method = "POST" target = "_blank">
<input type = "radio" name = "subject" value = "maths"> Maths
<input type = "radio" name = "subject" value = "physics"> Physics
<input type = "submit" value = "Select Subject">
</form>

Kết quả của mã này là dạng sau:

Dưới là radiobutton.cgi script để xử lý đầu vào do trình duyệt web cung cấp cho nút radio.

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM); # Read in text $ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } # Split information into name/value pairs @pairs = split(/&/, $buffer);
foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /; $value =~ s/%(..)/pack("C", hex($1))/eg; $FORM{$name} = $value;
}
$subject = $FORM{subject};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Radio - Fourth CGI Program</title>";
print "</head>";
print "<body>";
print "<h2> Selected Subject is $subject</h2>";
print "</body>";
print "</html>";

1;

Chuyển dữ liệu vùng văn bản sang chương trình CGI

Phần tử textarea được sử dụng khi văn bản nhiều dòng phải được chuyển đến Chương trình CGI. Đây là mã HTML mẫu cho biểu mẫu có hộp TEXTAREA -

<form action = "/cgi-bin/textarea.cgi" method = "POST" target = "_blank">
<textarea name = "textcontent" cols = 40 rows = 4>
Type your text here...
</textarea>
<input type = "submit" value = "Submit">
</form>

Kết quả của mã này là dạng sau:

Dưới đây là textarea.cgi script để xử lý đầu vào do trình duyệt web cung cấp.

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM); # Read in text $ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } # Split information into name/value pairs @pairs = split(/&/, $buffer);
foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /; $value =~ s/%(..)/pack("C", hex($1))/eg; $FORM{$name} = $value;
}
$text_content = $FORM{textcontent};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Text Area - Fifth CGI Program</title>";
print "</head>";
print "<body>";
print "<h2> Entered Text Content is $text_content</h2>";
print "</body>";
print "</html>";

1;

Chuyển dữ liệu hộp thả xuống cho chương trình CGI

Hộp thả xuống được sử dụng khi chúng ta có nhiều tùy chọn nhưng chỉ một hoặc hai tùy chọn được chọn. Đây là mã HTML mẫu cho biểu mẫu có một hộp thả xuống

<form action = "/cgi-bin/dropdown.cgi" method = "POST" target = "_blank">
<select name = "dropdown">
<option value = "Maths" selected>Maths</option>
<option value = "Physics">Physics</option>
</select>
<input type = "submit" value = "Submit">
</form>

Kết quả của mã này là dạng sau:

Dưới đây là dropdown.cgi script để xử lý đầu vào do trình duyệt web cung cấp.

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM); # Read in text $ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } # Split information into name/value pairs @pairs = split(/&/, $buffer);
foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /; $value =~ s/%(..)/pack("C", hex($1))/eg; $FORM{$name} = $value;
}
$subject = $FORM{dropdown};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Dropdown Box - Sixth CGI Program</title>";
print "</head>";
print "<body>";
print "<h2> Selected Subject is $subject</h2>";
print "</body>";
print "</html>";

1;

Sử dụng Cookie trong CGI

Giao thức HTTP là một giao thức không trạng thái. Nhưng đối với một trang web thương mại, cần phải duy trì thông tin phiên giữa các trang khác nhau. Ví dụ: một đăng ký người dùng kết thúc sau khi các giao dịch kéo dài qua nhiều trang. Nhưng làm thế nào để duy trì thông tin phiên của người dùng trên tất cả các trang web?

Trong nhiều tình huống, sử dụng cookie là phương pháp hiệu quả nhất để ghi nhớ và theo dõi các sở thích, mua hàng, hoa hồng và các thông tin khác cần thiết để có trải nghiệm khách truy cập hoặc thống kê trang web tốt hơn.

Làm thế nào nó hoạt động

Máy chủ của bạn gửi một số dữ liệu đến trình duyệt của khách truy cập dưới dạng cookie. Trình duyệt có thể chấp nhận cookie. Nếu có, nó được lưu trữ dưới dạng bản ghi văn bản thuần túy trên ổ cứng của khách truy cập. Bây giờ, khi khách truy cập đến một trang khác trên trang web của bạn, cookie sẽ có sẵn để truy xuất. Sau khi được truy xuất, máy chủ của bạn biết / ghi nhớ những gì đã được lưu trữ.

Cookie là một bản ghi dữ liệu văn bản thuần túy gồm 5 trường có độ dài thay đổi -

  • Expires- Ngày cookie sẽ hết hạn. Nếu ô này trống, cookie sẽ hết hạn khi khách truy cập thoát khỏi trình duyệt.

  • Domain - Tên miền của trang web của bạn.

  • Path- Đường dẫn đến thư mục hoặc trang web đặt cookie. Phần này có thể để trống nếu bạn muốn lấy cookie từ bất kỳ thư mục hoặc trang nào.

  • Secure- Nếu trường này chứa từ "an toàn" thì cookie chỉ có thể được truy xuất bằng máy chủ bảo mật. Nếu trường này trống, không có hạn chế như vậy tồn tại.

  • Name = Value - Cookie được thiết lập và xem xét lại dưới dạng các cặp khóa và giá trị.

Thiết lập Cookie

Rất dễ dàng để gửi cookie đến trình duyệt. Các cookie này sẽ được gửi cùng với HTTP Header. Giả sử bạn muốn đặt UserID và Mật khẩu làm cookie. Vì vậy, nó sẽ được thực hiện như sau:

#!/usr/bin/perl

print "Set-Cookie:UserID = XYZ;\n";
print "Set-Cookie:Password = XYZ123;\n";
print "Set-Cookie:Expires = Tuesday, 31-Dec-2007 23:12:40 GMT";\n";
print "Set-Cookie:Domain = www.tutorialspoint.com;\n";
print "Set-Cookie:Path = /perl;\n";
print "Content-type:text/html\r\n\r\n";
...........Rest of the HTML Content goes here....

Ở đây chúng tôi đã sử dụng Set-CookieTiêu đề HTTP để đặt cookie. Bạn có thể tùy chọn đặt các thuộc tính cookie như Expires, Domain và Path. Điều quan trọng cần lưu ý là cookie được đặt trước khi gửi dòng ma thuật"Content-type:text/html\r\n\r\n.

Truy xuất Cookie

Rất dễ dàng để truy xuất tất cả các cookie đã đặt. Cookie được lưu trữ trong biến môi trường CGI HTTP_COOKIE và chúng sẽ có dạng sau.

key1 = value1;key2 = value2;key3 = value3....

Đây là một ví dụ về cách lấy cookie.

#!/usr/bin/perl
$rcvd_cookies = $ENV{'HTTP_COOKIE'}; @cookies = split /;/, $rcvd_cookies;
foreach $cookie ( @cookies ) { ($key, $val) = split(/=/, $cookie); # splits on the first =.
   $key =~ s/^\s+//; $val =~ s/^\s+//;
   $key =~ s/\s+$//;
   $val =~ s/\s+$//;
   if( $key eq "UserID" ) { $user_id = $val; } elsif($key eq "Password") {
      $password = $val;
   }
}
print "User ID  = $user_id\n"; print "Password = $password\n";

Điều này sẽ tạo ra kết quả sau, với điều kiện các cookie trên đã được thiết lập trước khi gọi tập lệnh cookie truy xuất.

User ID = XYZ
Password = XYZ123

Thư viện và Mô-đun CGI

Bạn sẽ tìm thấy nhiều mô-đun tích hợp sẵn trên internet, cung cấp cho bạn các chức năng trực tiếp để sử dụng trong chương trình CGI của bạn. Sau đây là một lần quan trọng.

  • Mô-đun CGI

  • Berkeley cgi-lib.pl

Gói là gì?

Các packagecâu lệnh chuyển ngữ cảnh đặt tên hiện tại sang một vùng tên cụ thể (bảng biểu tượng). Như vậy -

  • Gói là một tập hợp mã nằm trong không gian tên riêng của nó.

  • Không gian tên là một tập hợp được đặt tên của các tên biến duy nhất (còn được gọi là bảng ký hiệu).

  • Không gian tên ngăn chặn xung đột tên biến giữa các gói.

  • Các gói cho phép xây dựng các mô-đun mà khi được sử dụng, sẽ không làm tắc nghẽn các biến và chức năng bên ngoài không gian tên riêng của mô-đun.

  • Gói vẫn có hiệu lực cho đến khi một câu lệnh gói khác được gọi hoặc cho đến khi kết thúc khối hoặc tệp hiện tại.

  • Bạn có thể tham chiếu rõ ràng đến các biến trong một gói bằng cách sử dụng :: bộ định tính gói.

Sau đây là một ví dụ có gói chính và gói Foo trong một tệp. Ở đây biến đặc biệt __PACKAGE__ đã được sử dụng để in tên gói.

#!/usr/bin/perl

# This is main package
$i = 1; print "Package name : " , __PACKAGE__ , " $i\n"; 

package Foo;
# This is Foo package
$i = 10; print "Package name : " , __PACKAGE__ , " $i\n"; 

package main;
# This is again main package
$i = 100; print "Package name : " , __PACKAGE__ , " $i\n"; 
print "Package name : " , __PACKAGE__ ,  " $Foo::i\n"; 

1;

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

Package name : main 1
Package name : Foo 10
Package name : main 100
Package name : main 10

Khối BEGIN và END

Bạn có thể xác định bất kỳ số lượng khối mã nào có tên BEGIN và END, chúng hoạt động như các hàm tạo và hủy tương ứng.

BEGIN { ... }
END { ... }
BEGIN { ... }
END { ... }
  • Mỗi BEGIN khối được thực thi sau khi tập lệnh perl được tải và biên dịch nhưng trước khi bất kỳ câu lệnh nào khác được thực thi.

  • Mọi khối END được thực thi ngay trước khi trình thông dịch perl thoát.

  • Các khối BEGIN và END đặc biệt hữu ích khi tạo các mô-đun Perl.

Ví dụ sau đây cho thấy cách sử dụng của nó -

#!/usr/bin/perl

package Foo;
print "Begin and Block Demo\n";

BEGIN { 
   print "This is BEGIN Block\n" 
}

END { 
   print "This is END Block\n" 
}

1;

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

This is BEGIN Block
Begin and Block Demo
This is END Block

Mô-đun Perl là gì?

Mô-đun Perl là một gói có thể sử dụng lại được xác định trong tệp thư viện có tên giống với tên của gói có phần mở rộng là .pm.

Một tệp mô-đun Perl được gọi là Foo.pm có thể chứa các câu lệnh như thế này.

#!/usr/bin/perl

package Foo;
sub bar { 
   print "Hello $_[0]\n" 
}

sub blat { 
   print "World $_[0]\n" 
}
1;

Vài điểm quan trọng về mô-đun Perl

  • Chức năng requireuse sẽ tải một mô-đun.

  • Cả hai đều sử dụng danh sách các đường dẫn tìm kiếm trong @INC để tìm mô-đun.

  • Cả hai chức năng requireuse gọi eval chức năng xử lý mã.

  • Các 1; ở dưới cùng khiến cho eval đánh giá thành TRUE (và do đó không thất bại).

Chức năng Yêu cầu

Một mô-đun có thể được tải bằng cách gọi require chức năng như sau -

#!/usr/bin/perl

require Foo;

Foo::bar( "a" );
Foo::blat( "b" );

Bạn phải nhận thấy rằng tên chương trình con phải có đầy đủ điều kiện để gọi chúng. Sẽ rất tốt nếu bật chương trình conbarblat được nhập vào không gian tên riêng của chúng tôi để chúng tôi không phải sử dụng bộ định nghĩa Foo ::.

Chức năng sử dụng

Một mô-đun có thể được tải bằng cách gọi use chức năng.

#!/usr/bin/perl

use Foo;

bar( "a" );
blat( "b" );

Lưu ý rằng chúng ta không cần phải đáp ứng đầy đủ các tên chức năng của gói. Cácuse hàm sẽ xuất một danh sách các ký hiệu từ một mô-đun được cung cấp một vài câu lệnh được thêm vào bên trong một mô-đun.

require Exporter;
@ISA = qw(Exporter);

Sau đó, cung cấp danh sách các ký hiệu (vô hướng, danh sách, băm, chương trình con, v.v.) bằng cách điền vào biến danh sách có tên @EXPORT: Ví dụ -

package Module;

require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(bar blat);

sub bar { print "Hello $_[0]\n" }
sub blat { print "World $_[0]\n" } sub splat { print "Not $_[0]\n" }  # Not exported!

1;

Tạo cây mô-đun Perl

Khi bạn đã sẵn sàng gửi mô-đun Perl của mình, thì sẽ có cách chuẩn để tạo Cây mô-đun Perl. Điều này được thực hiện bằng cách sử dụngh2xstiện ích. Tiện ích này đi kèm với Perl. Đây là cú pháp để sử dụng h2xs:

$h2xs -AX -n  ModuleName

Ví dụ: nếu mô-đun của bạn có sẵn trong Person.pm , sau đó chỉ cần đưa ra lệnh sau:

$h2xs -AX -n Person

Điều này sẽ tạo ra kết quả sau:

Writing Person/lib/Person.pm
Writing Person/Makefile.PL
Writing Person/README
Writing Person/t/Person.t
Writing Person/Changes
Writing Person/MANIFEST

Đây là mô tả của các tùy chọn này -

  • -A bỏ qua mã Autoloader (tốt nhất được sử dụng bởi các mô-đun xác định một số lượng lớn các chương trình con không được sử dụng thường xuyên).

  • -X bỏ qua các phần tử XS (Chương trình con eXternal, trong đó eXternal có nghĩa là bên ngoài Perl, tức là C).

  • -n chỉ định tên của mô-đun.

Vì vậy, lệnh trên tạo cấu trúc sau bên trong thư mục Person. Kết quả thực tế được hiển thị ở trên.

  • Changes
  • Makefile.PL
  • MANIFEST (chứa danh sách tất cả các tệp trong gói)
  • README
  • t / (tệp thử nghiệm)
  • lib / (Mã nguồn thực tế ở đây

Vì vậy, cuối cùng, bạn tarcấu trúc thư mục này thành một tệp Person.tar.gz và bạn có thể gửi nó. Bạn sẽ phải cập nhật tệp README với các hướng dẫn thích hợp. Bạn cũng có thể cung cấp một số tệp ví dụ thử nghiệm trong thư mục t.

Cài đặt Mô-đun Perl

Tải xuống mô-đun Perl ở dạng tệp tar.gz. Sử dụng trình tự sau để cài đặt bất kỳ Mô-đun Perl nàoPerson.pm đã được tải xuống dưới dạng Person.tar.gz tập tin.

tar xvfz Person.tar.gz
cd Person
perl Makefile.PL
make
make install

Trình thông dịch Perl có một danh sách các thư mục trong đó nó tìm kiếm các mô-đun (mảng toàn cầu @INC).

Bạn có thể sử dụng Perl theo nhiều cách khác nhau để tạo các quy trình mới theo yêu cầu của bạn. Hướng dẫn này sẽ liệt kê một vài phương pháp quan trọng và được sử dụng thường xuyên nhất để tạo và quản lý các quy trình Perl.

  • Bạn có thể sử dụng các biến đặc biệt $$ hoặc là $PROCESS_ID để lấy ID quy trình hiện tại.

  • Mọi quy trình được tạo bằng bất kỳ phương pháp nào đã đề cập, đều duy trì môi trường ảo của riêng nó với %ENV Biến đổi.

  • Các exit() hàm luôn thoát khỏi tiến trình con thực thi chức năng này và toàn bộ quá trình chính sẽ không thoát trừ khi tất cả các tiến trình con đang chạy đã thoát.

  • Tất cả các chốt điều khiển đang mở đều bị trùng lặp () - ed trong các tiến trình con, do đó, việc đóng bất kỳ chốt điều khiển nào trong một quy trình không ảnh hưởng đến các quy trình khác.

Toán tử Backstick

Cách đơn giản nhất này để thực thi bất kỳ lệnh Unix nào là sử dụng toán tử dấu lùi. Bạn chỉ cần đặt lệnh của mình bên trong toán tử cần gạt ngược, điều này sẽ dẫn đến việc thực thi lệnh và trả về kết quả của nó có thể được lưu trữ như sau:

#!/usr/bin/perl

@files = `ls -l`;

foreach $file (@files) { print $file;
}

1;

Khi đoạn mã trên được thực thi, nó sẽ liệt kê tất cả các tệp và thư mục có sẵn trong thư mục hiện tại -

drwxr-xr-x 3 root root 4096 Sep 14 06:46 9-14
drwxr-xr-x 4 root root 4096 Sep 13 07:54 android
-rw-r--r-- 1 root root  574 Sep 17 15:16 index.htm
drwxr-xr-x 3  544  401 4096 Jul  6 16:49 MIME-Lite-3.01
-rw-r--r-- 1 root root   71 Sep 17 15:16 test.pl
drwx------ 2 root root 4096 Sep 17 15:11 vAtrJdy

Hệ thống () Chức năng

Bạn cũng có thể dùng system()hàm để thực thi bất kỳ lệnh Unix nào mà đầu ra của nó sẽ chuyển đến đầu ra của tập lệnh perl. Theo mặc định, đó là màn hình, tức là STDOUT, nhưng bạn có thể chuyển hướng nó đến bất kỳ tệp nào bằng cách sử dụng toán tử chuyển hướng> -

#!/usr/bin/perl

system( "ls -l")

1;

Khi đoạn mã trên được thực thi, nó sẽ liệt kê tất cả các tệp và thư mục có sẵn trong thư mục hiện tại -

drwxr-xr-x 3 root root 4096 Sep 14 06:46 9-14
drwxr-xr-x 4 root root 4096 Sep 13 07:54 android
-rw-r--r-- 1 root root  574 Sep 17 15:16 index.htm
drwxr-xr-x 3  544  401 4096 Jul  6 16:49 MIME-Lite-3.01
-rw-r--r-- 1 root root   71 Sep 17 15:16 test.pl
drwx------ 2 root root 4096 Sep 17 15:11 vAtrJdy

Hãy cẩn thận khi lệnh của bạn chứa các biến môi trường shell như $PATH or $TRANG CHỦ. Hãy thử làm theo ba tình huống -

#!/usr/bin/perl

$PATH = "I am Perl Variable"; system('echo $PATH');  # Treats $PATH as shell variable system("echo $PATH");  # Treats $PATH as Perl variable system("echo \$PATH"); # Escaping $ works.

1;

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau tùy thuộc vào những gì được đặt trong biến shell $ PATH.

/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin
I am Perl Variable
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin

Hàm fork ()

Perl cung cấp một fork()chức năng tương ứng với lệnh gọi hệ thống Unix cùng tên. Trên hầu hết các nền tảng giống Unix có lệnh gọi hệ thống fork (), Perl's fork () chỉ đơn giản gọi nó. Trên một số nền tảng như Windows mà lệnh gọi hệ thống fork () không khả dụng, Perl có thể được xây dựng để mô phỏng fork () ở cấp thông dịch viên.

Hàm fork () được sử dụng để sao chép một tiến trình hiện tại. Lệnh gọi này tạo ra một tiến trình mới chạy cùng một chương trình tại cùng một điểm. Nó trả về pid con cho quy trình mẹ, 0 cho quy trình con hoặc undef nếu fork không thành công.

Bạn có thể dùng exec() hàm trong một quy trình để khởi chạy tệp thực thi được yêu cầu, tệp này sẽ được thực thi trong một vùng quy trình riêng biệt và tệp execute () sẽ đợi tệp hoàn tất trước khi thoát với cùng trạng thái thoát như quy trình đó.

#!/usr/bin/perl

if(!defined($pid = fork())) { # fork returned undef, so unsuccessful die "Cannot fork a child: $!";
} elsif ($pid == 0) { print "Printed by child process\n"; exec("date") || die "can't exec date: $!";
  
} else {
   # fork returned 0 nor undef
   # so this branch is parent
   print "Printed by parent process\n";
   $ret = waitpid($pid, 0);
   print "Completed process id: $ret\n";

}

1;

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

Printed by parent process
Printed by child process
Tue Sep 17 15:41:08 CDT 2013
Completed process id: 17777

Các wait()waitpid()có thể được chuyển dưới dạng ID quá trình giả được trả về bởi fork (). Các cuộc gọi này sẽ đợi đúng cách cho quá trình giả kết thúc và trả về trạng thái của nó. Nếu bạn ngã ba mà không bao giờ chờ đợi con bạn sử dụngwaitpid()chức năng, bạn sẽ tích lũy zombie. Trên hệ thống Unix, bạn có thể tránh điều này bằng cách đặt $ SIG {CHLD} thành "BỎ QUA" như sau:

#!/usr/bin/perl

local $SIG{CHLD} = "IGNORE"; if(!defined($pid = fork())) {
   # fork returned undef, so unsuccessful
   die "Cannot fork a child: $!"; } elsif ($pid == 0) {
   print "Printed by child process\n";
   exec("date") || die "can't exec date: $!"; } else { # fork returned 0 nor undef # so this branch is parent print "Printed by parent process\n"; $ret = waitpid($pid, 0); print "Completed process id: $ret\n";

}

1;

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

Printed by parent process
Printed by child process
Tue Sep 17 15:44:07 CDT 2013
Completed process id: -1

Hàm kill ()

Perl kill('KILL', (Process List)) hàm có thể được sử dụng để kết thúc một quá trình giả bằng cách chuyển cho nó ID được trả về bởi fork ().

Lưu ý rằng việc sử dụng kill ('KILL', (Process List)) trên một tiến trình giả () thường có thể gây ra rò rỉ bộ nhớ, bởi vì luồng thực thi quy trình giả không có cơ hội dọn dẹp tài nguyên của nó.

Bạn có thể dùng kill() chức năng gửi bất kỳ tín hiệu nào khác tới các quy trình đích, ví dụ như sau sẽ gửi SIGINT đến ID quy trình 104 và 102 -

#!/usr/bin/perl

kill('INT', 104, 102);
 
1;

Bạn có thể nhúng tài liệu Pod (Văn bản cũ thuần túy) vào các mô-đun và tập lệnh Perl của mình. Sau đây là quy tắc để sử dụng tài liệu nhúng trong Mã Perl của bạn:

Bắt đầu tài liệu của bạn bằng một dòng trống, a =head1 ở đầu lệnh và kết thúc bằng dấu =cut

Perl sẽ bỏ qua văn bản Pod mà bạn đã nhập trong mã. Sau đây là một ví dụ đơn giản về việc sử dụng tài liệu nhúng bên trong mã Perl của bạn:

#!/usr/bin/perl

print "Hello, World\n";

=head1 Hello, World Example
This example demonstrate very basic syntax of Perl.
=cut

print "Hello, Universe\n";

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

Hello, World
Hello, Universe

Nếu bạn định đặt Pod của mình ở cuối tệp và bạn đang sử dụng dấu cắt __END__ hoặc __DATA__, hãy nhớ đặt một dòng trống ở đó trước lệnh Pod đầu tiên như sau, nếu không thì không có dòng trống trước cái =head1, nhiều người dịch sẽ không nhận ra =head1 khi bắt đầu một khối Pod.

#!/usr/bin/perl

print "Hello, World\n";

while(<DATA>) {
  print $_;
}

__END__

=head1 Hello, World Example
This example demonstrate very basic syntax of Perl.
print "Hello, Universe\n";

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

Hello, World

=head1 Hello, World Example
This example demonstrate very basic syntax of Perl.
print "Hello, Universe\n";

Hãy lấy một ví dụ khác cho cùng một đoạn mã mà không cần đọc phần DATA -

#!/usr/bin/perl

print "Hello, World\n";

__END__

=head1 Hello, World Example
This example demonstrate very basic syntax of Perl.
print "Hello, Universe\n";

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

Hello, World

POD là gì?

Pod là một ngôn ngữ đánh dấu dễ sử dụng được sử dụng để viết tài liệu cho các chương trình Perl, Perl và mô-đun Perl. Có nhiều trình dịch khác nhau có sẵn để chuyển đổi Pod sang các định dạng khác nhau như văn bản thuần túy, HTML, trang người đàn ông và hơn thế nữa. Đánh dấu nhóm bao gồm ba loại đoạn văn cơ bản -

  • Ordinary Paragraph - Bạn có thể sử dụng mã định dạng trong các đoạn văn thông thường, cho chữ in đậm, in nghiêng, kiểu mã, siêu liên kết, v.v.

  • Verbatim Paragraph - Các đoạn văn nguyên văn thường được sử dụng để trình bày một khối mã hoặc văn bản khác không yêu cầu bất kỳ phân tích cú pháp hoặc định dạng đặc biệt nào và không nên bao bọc.

  • Command Paragraph- Một đoạn lệnh được sử dụng để xử lý đặc biệt toàn bộ phần văn bản, thường là các tiêu đề hoặc các phần của danh sách. Tất cả các đoạn lệnh đều bắt đầu bằng =, theo sau là một mã định danh, tiếp theo là văn bản tùy ý mà lệnh có thể sử dụng theo cách nào phù hợp. Các lệnh hiện được công nhận là -

=pod
=head1 Heading Text
=head2 Heading Text
=head3 Heading Text
=head4 Heading Text
=over indentlevel
=item stuff
=back
=begin format
=end format
=for format text...
=encoding type
=cut

Ví dụ về POD

Hãy xem xét POD sau -

=head1 SYNOPSIS
Copyright 2005 [TUTORIALSOPOINT].
=cut

Bạn có thể dùng pod2html tiện ích có sẵn trên Linux để chuyển đổi POD ở trên thành HTML, vì vậy nó sẽ tạo ra kết quả sau:

Tiếp theo, hãy xem xét ví dụ sau:

=head2 An Example List

=over 4
=item * This is a bulleted list.
=item * Here's another item.
=back
=begin html
<p>
Here's some embedded HTML.  In this block I can
include images, apply <span style="color: green">
styles</span>, or do anything else I can do with
HTML.  pod parsers that aren't outputting HTML will
completely ignore it.
</p>

=end html

Khi bạn chuyển đổi POD ở trên thành HTML bằng pod2html, nó sẽ tạo ra kết quả sau:

An Example List
   This is a bulleted list.
   Here's another item.
Here's some embedded HTML. In this block I can include images, apply 
styles, or do anything else I can do with HTML. pod parsers that aren't 
outputting HTML will completely ignore it.

Đây là danh sách tất cả các chức năng quan trọng được hỗ trợ bởi Perl tiêu chuẩn.

  • abs - hàm giá trị tuyệt đối

  • chấp nhận - chấp nhận kết nối ổ cắm đến

  • báo thức - lên lịch SIGALRM

  • atan2 - arctang của Y / X trong phạm vi -PI đến PI

  • bind - liên kết một địa chỉ với một ổ cắm

  • binmode - chuẩn bị các tệp nhị phân cho I / O

  • ban phước - tạo ra một đối tượng

  • caller - lấy ngữ cảnh của lệnh gọi chương trình con hiện tại

  • chdir - thay đổi thư mục làm việc hiện tại của bạn

  • chmod - thay đổi quyền trên danh sách tệp

  • chomp - loại bỏ dấu phân tách bản ghi theo sau khỏi chuỗi

  • chop - xóa ký tự cuối cùng khỏi một chuỗi

  • chown - thay đổi quyền sở hữu trên một danh sách các tệp

  • chr - lấy ký tự mà số này đại diện

  • chroot - tạo thư mục gốc mới để tra cứu đường dẫn

  • đóng - đóng tệp (hoặc đường ống hoặc ổ cắm) tay cầm

  • closeir - đóng thư mục xử lý

  • kết nối - kết nối với ổ cắm từ xa

  • tiếp tục - khối theo dõi tùy chọn trong một thời gian hoặc chuyển tiếp

  • cos - hàm cosin

  • crypt - mã hóa kiểu mật khẩu một chiều

  • dbmclose - ngắt ràng buộc trên tệp dbm bị ràng buộc

  • dbmopen - tạo ràng buộc trên tệp dbm được ràng buộc

  • được xác định - kiểm tra xem một giá trị, biến hoặc hàm có được xác định hay không

  • xóa - xóa một giá trị khỏi hàm băm

  • chết - nêu ra một ngoại lệ hoặc cứu trợ

  • làm - biến KHỐI thành HẠN

  • kết xuất - tạo kết xuất lõi ngay lập tức

  • mỗi - truy xuất cặp khóa / giá trị tiếp theo từ một hàm băm

  • endgrent - được thực hiện bằng cách sử dụng tệp nhóm

  • endhostent - được thực hiện bằng cách sử dụng tệp máy chủ

  • endnetent - được thực hiện bằng cách sử dụng tệp mạng

  • endprotoent - được thực hiện bằng cách sử dụng tệp giao thức

  • endpwent - được thực hiện bằng cách sử dụng tệp mật khẩu

  • endervent - được thực hiện bằng cách sử dụng tệp dịch vụ

  • eof - kiểm tra một bộ xử lý tệp cho phần cuối của nó

  • eval - bắt các ngoại lệ hoặc biên dịch và chạy mã

  • executive - bỏ chương trình này để chạy chương trình khác

  • tồn tại - kiểm tra xem khóa băm có tồn tại hay không

  • thoát - chấm dứt chương trình này

  • exp - nâng cao tôi đến một sức mạnh

  • fcntl - lệnh gọi hệ thống kiểm soát tệp

  • fileno - trả về bộ mô tả tệp từ tệp xử lý

  • bầy đàn - khóa toàn bộ tệp bằng khóa tư vấn

  • fork - tạo một quy trình mới giống như quy trình này

  • format - khai báo một định dạng hình ảnh được sử dụng bởi hàm write ()

  • formline - chức năng bên trong được sử dụng cho các định dạng

  • getc - lấy ký tự tiếp theo từ tệp xử lý

  • getgrent - nhận kỷ lục nhóm tiếp theo

  • getgrgid - nhận bản ghi nhóm đã cung cấp ID người dùng nhóm

  • getgrnam - lấy bản ghi nhóm đã cho tên nhóm

  • gethostbyaddr - lấy bản ghi máy chủ lưu trữ cung cấp địa chỉ của nó

  • gethostbyname - lấy tên bản ghi máy chủ lưu trữ

  • gethostent - nhận bản ghi máy chủ tiếp theo

  • getlogin - trả lại người đã đăng nhập tại tty này

  • getnetbyaddr - lấy bản ghi mạng cung cấp địa chỉ của nó

  • getnetbyname - lấy tên bản ghi mạng

  • getnetent - nhận bản ghi các mạng tiếp theo

  • getpeername - tìm đầu kia của kết nối socket

  • getpgrp - lấy nhóm quy trình

  • getppid - lấy ID quy trình mẹ

  • thâm niên - nhận giá trị tốt đẹp hiện tại

  • getprotobyname - lấy tên bản ghi giao thức

  • getprotobynumber - lấy giao thức bản ghi giao thức số

  • getprotoent - nhận bản ghi giao thức tiếp theo

  • getpwent - nhận bản ghi mật khẩu tiếp theo

  • getpwnam - lấy bản ghi mật khẩu cho tên đăng nhập của người dùng

  • getpwuid - lấy bản ghi mật khẩu đã cung cấp ID người dùng

  • getervbyname - lấy bản ghi dịch vụ với tên của nó

  • getervbyport - nhận bản ghi dịch vụ cho cổng số

  • getervent - nhận hồ sơ dịch vụ tiếp theo

  • getsockname - truy xuất sockaddr cho một ổ cắm nhất định

  • getsockopt - nhận các tùy chọn ổ cắm trên một ổ cắm nhất định

  • cầu - mở rộng tên tệp bằng ký tự đại diện

  • gmtime - chuyển đổi thời gian UNIX thành bản ghi hoặc chuỗi sử dụng định dạng thời gian Greenwich.

  • goto - tạo mã spaghetti

  • grep - xác định vị trí các phần tử trong kiểm tra danh sách đúng với một tiêu chí nhất định

  • hex - chuyển đổi một chuỗi thành một số thập lục phân

  • nhập - vá không gian tên của mô-đun thành của riêng bạn

  • index - tìm một chuỗi con trong một chuỗi

  • int - lấy phần nguyên của một số

  • ioctl - lệnh gọi hệ thống điều khiển thiết bị phụ thuộc vào hệ thống

  • tham gia - nối danh sách thành một chuỗi bằng dấu phân cách

  • khóa - truy xuất danh sách các chỉ số từ một hàm băm

  • kill - gửi tín hiệu đến một quy trình hoặc nhóm quy trình

  • cuối cùng - thoát khỏi khối sớm

  • lc - trả về phiên bản viết thường của một chuỗi

  • lcfirst - trả về một chuỗi chỉ có chữ cái tiếp theo viết thường

  • length - trả về số byte trong một chuỗi

  • liên kết - tạo một liên kết cứng trong phần tệp

  • lắng nghe - đăng ký ổ cắm của bạn làm máy chủ

  • cục bộ - tạo giá trị tạm thời cho một biến toàn cục (phạm vi động)

  • localtime - chuyển đổi thời gian UNIX thành bản ghi hoặc chuỗi sử dụng giờ địa phương

  • lock - nhận khóa luồng trên một biến, chương trình con hoặc phương thức

  • log - truy xuất logarit tự nhiên cho một số

  • lstat - stat một liên kết tượng trưng

  • m - so khớp một chuỗi với một mẫu biểu thức chính quy

  • bản đồ - áp dụng thay đổi cho danh sách để lấy lại danh sách mới với những thay đổi

  • mkdir - tạo thư mục

  • msgctl - Hoạt động điều khiển tin nhắn SysV IPC

  • msgget - nhận hàng đợi tin nhắn SysV IPC

  • msgrcv - nhận tin nhắn SysV IPC từ hàng đợi tin nhắn

  • msgsnd - gửi tin nhắn SysV IPC đến hàng đợi tin nhắn

  • my - khai báo và gán một biến cục bộ (phạm vi từ vựng)

  • tiếp theo - lặp lại một khối sớm

  • không - không quan trọng một số ký hiệu mô-đun hoặc ngữ nghĩa tại thời điểm biên dịch

  • oct - chuyển đổi một chuỗi thành một số bát phân

  • open - mở một tệp, đường dẫn hoặc bộ mô tả

  • opendir - mở một thư mục

  • ord - tìm biểu diễn số của một ký tự

  • our - khai báo và gán một biến gói (phạm vi từ vựng)

  • pack - chuyển đổi một danh sách thành một biểu diễn nhị phân

  • gói - khai báo một vùng tên chung riêng

  • pipe - mở một cặp xử lý tệp được kết nối

  • pop - xóa phần tử cuối cùng khỏi một mảng và trả lại nó

  • pos - tìm hoặc đặt độ lệch cho tìm kiếm m // g cuối cùng / tiếp theo

  • print - xuất một danh sách vào một bộ xử lý tệp

  • printf - xuất một danh sách được định dạng vào một bộ xử lý tệp

  • nguyên mẫu - lấy nguyên mẫu (nếu có) của chương trình con

  • push - nối một hoặc nhiều phần tử vào một mảng

  • q - trích dẫn riêng một chuỗi

  • qq - trích dẫn kép một chuỗi

  • qr - Biên dịch mẫu

  • quotemeta - trích dẫn các ký tự ma thuật biểu thức chính quy

  • qw - trích dẫn một danh sách các từ

  • qx - backquote trích dẫn một chuỗi

  • rand - truy xuất số giả ngẫu nhiên tiếp theo

  • đọc - đầu vào được đệm có độ dài cố định từ một bộ xử lý tệp

  • readdir - lấy thư mục từ một trình điều khiển thư mục

  • readline - tìm nạp bản ghi từ một tệp

  • readlink - xác định vị trí của một liên kết tượng trưng đang trỏ đến

  • readpipe - thực hiện lệnh hệ thống và thu thập đầu ra tiêu chuẩn

  • recv - nhận tin nhắn qua Socket

  • làm lại - bắt đầu lặp lại vòng lặp này một lần nữa

  • ref - tìm ra loại thứ đang được tham chiếu

  • đổi tên - thay đổi tên tệp

  • yêu cầu - tải các chức năng bên ngoài từ thư viện trong thời gian chạy

  • đặt lại - xóa tất cả các biến của một tên nhất định

  • trở lại - thoát khỏi một chức năng sớm

  • đảo ngược - lật một chuỗi hoặc một danh sách

  • rewinddir - điều khiển thư mục đặt lại

  • rindex - tìm kiếm chuỗi con từ phải sang trái

  • rmdir - xóa một thư mục

  • s - thay thế một mẫu bằng một chuỗi

  • vô hướng - buộc một ngữ cảnh vô hướng

  • tìm kiếm - định vị lại con trỏ tệp cho I / O truy cập ngẫu nhiên

  • seekdir - con trỏ thư mục định vị lại

  • chọn - đặt lại đầu ra mặc định hoặc thực hiện ghép kênh I / O

  • semctl - Hoạt động điều khiển semaphore SysV

  • semget - nhận tập hợp các semaphores SysV

  • semop - Các hoạt động semaphore SysV

  • gửi - gửi tin nhắn qua ổ cắm

  • setgrent - chuẩn bị tệp nhóm để sử dụng

  • sethostent - chuẩn bị tệp máy chủ để sử dụng

  • setnetent - chuẩn bị tệp mạng để sử dụng

  • setpgrp - đặt nhóm quy trình của một quy trình

  • setpri thâm niên - thiết lập giá trị tốt đẹp của quy trình

  • setprotoent - chuẩn bị tệp giao thức để sử dụng

  • setpwent - chuẩn bị tệp mật khẩu để sử dụng

  • setervent - chuẩn bị tệp dịch vụ để sử dụng

  • setsockopt - đặt một số tùy chọn ổ cắm

  • shift - xóa phần tử đầu tiên của một mảng và trả lại nó

  • shmctl - Hoạt động bộ nhớ chia sẻ SysV

  • shmget - lấy mã định danh phân đoạn bộ nhớ dùng chung SysV

  • shmread - đọc bộ nhớ chia sẻ SysV

  • shmwrite - ghi bộ nhớ chia sẻ SysV

  • tắt máy - chỉ đóng một nửa kết nối ổ cắm

  • sin - trả về sin của một số

  • ngủ - chặn trong một số giây

  • socket - tạo một socket

  • socketpair - tạo một cặp ổ cắm

  • sắp xếp - sắp xếp danh sách các giá trị

  • splice - thêm hoặc xóa các phần tử ở bất kỳ đâu trong một mảng

  • split - tách một chuỗi bằng dấu phân cách regexp

  • sprintf - bản in được định dạng thành một chuỗi

  • sqrt - hàm căn bậc hai

  • srand - tạo ra số ngẫu nhiên

  • stat - nhận thông tin trạng thái của tệp

  • nghiên cứu - tối ưu hóa dữ liệu đầu vào cho các tìm kiếm lặp lại

  • sub - khai báo một chương trình con, có thể ẩn danh

  • substr - lấy hoặc thay đổi một phần của khuấy

  • liên kết tượng trưng - tạo một liên kết tượng trưng đến một tệp

  • syscall - thực hiện một lệnh gọi hệ thống tùy ý

  • sysopen - mở một tệp, đường dẫn hoặc bộ mô tả

  • sysread - đầu vào không có bộ đệm có độ dài cố định từ một bộ xử lý tệp

  • sysseek - vị trí con trỏ I / O trên tay cầm được sử dụng với sysread và syswrite

  • hệ thống - chạy một chương trình riêng biệt

  • syswrite - đầu ra không có bộ đệm có độ dài cố định vào một bộ xử lý tệp

  • nói - lấy công cụ tìm kiếm hiện tại trên một tập tin

  • telldir - lấy điểm tìm kiếm hiện tại trên một thư mục xử lý

  • tie - ràng buộc một biến với một lớp đối tượng

  • bị ràng buộc - nhận một tham chiếu đến đối tượng nằm dưới một biến bị ràng buộc

  • thời gian - số giây trả về kể từ năm 1970

  • thời gian - trả lại thời gian đã trôi qua cho các quy trình con và bản thân

  • tr - chuyển ngữ một chuỗi

  • cắt ngắn - rút ngắn tệp

  • uc - trả về phiên bản viết hoa của một chuỗi

  • ucfirst - trả về một chuỗi chỉ có chữ cái tiếp theo viết hoa

  • umask - đặt mặt nạ chế độ tạo tệp

  • undef - xóa định nghĩa biến hoặc hàm

  • hủy liên kết - xóa một liên kết đến một tệp

  • giải nén - chuyển đổi cấu trúc nhị phân thành các biến perl bình thường

  • unshift - thêm các phần tử khác vào đầu danh sách

  • cởi trói - phá vỡ ràng buộc ràng buộc với một biến

  • sử dụng - tải trong một mô-đun tại thời điểm biên dịch

  • utime - đặt lần truy cập cuối cùng của tệp và sửa đổi thời gian

  • giá trị - trả về danh sách các giá trị trong hàm băm

  • vec - kiểm tra hoặc đặt các bit cụ thể trong một chuỗi

  • chờ đợi - đợi bất kỳ quy trình con nào chết

  • Waitpid - đợi một quy trình con cụ thể chết đi

  • wantarray - lấy ngữ cảnh void vs vô hướng so với danh sách của lệnh gọi chương trình con hiện tại

  • cảnh báo - in thông tin gỡ lỗi

  • ghi - in một bản ghi hình ảnh

  • -X - kiểm tra tệp (-r, -x, v.v.)

  • y - chuyển ngữ một chuỗi