Perl được biết đến là một ngôn ngữ chỉnh sửa văn bản vô cùng phổ biến, và gần đây đang được ứng dụng trong nhiều lĩnh vực khác như lập trình mạng hay phát triển web. Bài viết này sẽ cung cấp mọi kiến thức cần biết về Perl, cũng như cách cài đặt và sử dụng ngôn ngữ Perl.
Perl là gì?
Perl (Practical Extraction and Reporting Language – Ngôn ngữ kết xuất và báo cáo thực dụng), được giới thiệu lần đầu vào năm 1987 bởi Larry Wall. Ban đầu thì Perl được thiết kế chuyên dùng cho mục đích soạn thảo văn bản. Nhưng hiện nay ứng dụng của nó đã được mở rộng sang nhiều lĩnh vực khác như: quản trị hệ thống Linux, lập trình mạng, phát triển web,…
Máy tính chỉ có thể giao tiếp với nhau bằng một chuỗi các số nhị phân 0 và 1, và con người dường như không thể giao tiếp với máy bằng ngôn ngữ này được. Perl là một ngôn ngữ sử dụng các phần tử ngôn ngữ tự nhiên, vì vậy con người có thể dễ dàng giao tiếp với máy hơn. Vì vậy Perl cũng được gọi là ngôn ngữ lập trình bậc cao.
Tuy nhiên, máy tính không thể hiểu được ngôn ngữ bậc cao, vì vậy ta cần một công cụ phiên dịch thành ngôn ngữ cấp thấp để máy tính có thể hiểu. Interpreter (trình thông dịch) chính là phần mềm có khả năng chuyển chương trình viết bằng ngôn ngữ bậc cao thành ngôn ngữ bậc thấp và thực thi các câu lệnh có trong chương trình này. Cũng vì lý do này mà ngôn ngữ Perl được gọi là ngôn ngữ lập trình thông dịch.
Perl được sử dụng trong các lĩnh vực nào?
Sức mạnh của Perl được ứng dụng trong rất nhiều lĩnh vực khác nhau, trong đó phổ biến nhất có thể kể đến phát triển web. Ngoài ra, Perl cũng được dùng để tự động hoá nhiều tác vụ trong web server, tự khởi tạo email, dọn dẹp hệ thống,… Và tất nhiên cũng không thể bỏ qua mục đích sử dụng ban đầu của Perl: kết xuất dữ liệu và khởi tạo báo cáo dựa trên lượng tài nguyên sử dụng, kiểm tra vấn đề bảo mật trong mạng.
Cũng vì tính đa năng và các đặc điểm của mình, Perl đã và đang là một trong những ngôn ngữ phổ biến nhất trong phát triển web, mạng và tin sinh học. Đặc biệt hơn, Perl thậm chí còn có thể được dùng để lập trình CGI, tạo và thực hiện các thao tác với hình ảnh, networking qua telnet, FTP, tạo GUI,…
Bên cạnh đó, Perl cũng được dùng để triển khai các chương trình hướng đối tượng, hỗ trợ mọi dạng kế thừa (kế thừa đơn, kế thừa đa cấp, kế thừa dạng kim cương), có tính đa hình và đóng gói. Ngôn ngữ này cũng cung cấp nhiều module để developer có thể viết và sử dụng code viết bằng Python, PHP, PDL, TCL, Octave, Java, C, C++, Basic, Ruby and Lua.
Lý do sử dụng Perl là gì?
Hiện nay có rất nhiều ngôn ngữ lập trình có khả năng thực hiện những điều vừa kể đến ở phần trên, vậy tại sao chúng ta lại cần đến Perl?
Trước tiên, Perl rất dễ học, đặc biệt là với những ai đã có kiến thức nền tảng về lập trình. Ngôn ngữ này được thiết kế để con người có thể dễ dàng đọc hiểu, đồng thời máy tính cũng có thể xử lý thuận tiện hơn. Ngoài ra Perl cũng hỗ trợ biểu thức chính quy (regular expression), cú pháp và ngữ pháp linh hoạt.
Thứ hai, Perl có tính di động rất cao và có thể chạy trên bất kỳ hệ điều hành nào (hay còn gọi là không phụ thuộc vào platform). Mọi hệ điều hành dựa trên Linux đều đi kèm sẵn Perl nên người dùng Linux sẽ không cần phải cài đặt ngôn ngữ này nữa.
Và cuối cùng, Perl có khả năng xử lý các tác vụ nhỏ dễ dàng và vô cùng nhanh chóng. Dưới đây là một ví dụ về đoạn code Hello World cho ngôn ngữ lập trình này:
#!/usr/bin/perl
print "Hello, world!";
Chỉ với hai dòng code đơn giản là ta đã có được chương trình Perl đầu tiên của mình, rất dễ đúng không nào?
Bên cạnh đó, Perl cũng vô cùng phổ biến trong lĩnh vực phát triển web. Hầu hết mọi thứ diễn ra trên web đều là văn bản, và Perl thì lại vô cùng xuất sắc trong việc xử lý và chỉnh sửa văn bản. Do đó đây có thể được xem là ngôn ngữ tốt nhất cho mục đích xử lý file, văn bản và kết xuất báo cáo.
Ưu và nhược điểm của Perl là gì?
Ưu điểm
- Khả năng xử lý văn bản và phân tích cú pháp rất tốt.
- Ngôn ngữ thông dịch, khả năng thực thi nhanh và không cần compile script Perl.
- Đơn giản, dễ sử dụng.
- Hỗ trợ thư viện CPAN.
- Có thể dùng để phát triển web cho hầu hết các cổng thanh toán.
- Được ứng dụng trong tự động hoá và kiểm tra hầu hết các lĩnh vực liên quan đến mạng hay lưu trữ.
Nhược điểm
- Ít hỗ trợ GUI.
- Cần phải làm việc với các module thư viện phức tạp.
- Cần thực hành nhiều để hiểu các Pattern phức tạp.
Cách cài đặt Perl
Sau khi tìm hiểu sơ qua về lịch sử và ứng dụng của Perl, hãy cũng bắt đầu hành trình với ngôn ngữ này bằng việc cài đặt nó lên hệ thống của mình.
Perl download – Windows, Mac và Linux
Hiện các phiên bản Perl đều tương thích với các hệ điều hành thông dụng hiện nay. Bạn có thể download Perl tương ứng với hệ điều hành đang sử dụng tại đây: https://www.perl.org/get.html.
Tiếp theo đây sẽ là cách cài đặt Perl cho từng hệ điều hành.
Cách cài đặt Perl cho Linux
Đối với các hệ điều hành dựa trên Linux thì Perl sẽ được cài đặt sẵn. Để kiểm tra xem máy đã có ngôn ngữ này chưa, hãy nhập lệnh perl -v
vào trong command line.
- Thay đổi thư mục để cài đặt Perl:
- Bắt đầu quá trình cài đặt:
- Chọn thư mục để cài đặt Perl:
- Kết thúc cài đặt:
Nếu cần cập nhật phiên bản mới nhất của Perl thì nhập tiếp lệnh sau:
sudo apt-get install perl
Cách cài đặt Perl cho Windows
Đối với Windows thì bạn có thể làm theo các bước sau:
- Download file cài đặt tương tự như trên sau đó mở file cài đặt và nhấn Next.
- Chấp nhận các điều khoản và nhấn Next.
- Chọn những mục cài đặt sau đó tiếp tục chọn Next.
- Chờ đợi quá trình cài đặt.
- Cài đặt xong bạn chọn Finish để hoàn tất.
Sau khi cài đặt xong, chạy lệnh perl -v trong command line để xem đã cài đặt thành công chưa.
Việc cài đặt môi trường cho Perl trên Linux và Windows sẽ hơi phức tạp một chút, vì bản cài đặt không đi kèm sẵn nhiều thư viện. Các thư viện bổ sung có thể được cài đạt thủ công bằng CPAN (Comprehensive Perl Archive Network) hoặc PPM cho Windows. Tất nhiên ta vẫn có thể viết các đoạn code cơ bản mà không cần đến các thư viện này.
Chương trình Perl đầu tiên
Sau khi hoàn tất quá trình cài đặt, bất kỳ IDE hoặc trình soạn thảo văn bản nào cũng có thể được sử dụng để viết code Perl và chạy chúng trên IDE hoặc cmd bằng cách sử dụng lệnh:
perl file_name.pl
Dưới là một chương trình mẫu để bắt đầu sử dụng Perl :
#!/usr/bin/perl
# Modules used
use strict;
use warnings;
# Print function
print("Hello World\n");
Output
Bây giờ hãy cùng phân tích từng dòng một:
#!/usr/bin/perl
yêu cầu hệ điều hành thực thi file với chương trình có trong đường dẫn /usr/bin/perl
. Một số IDE không yêu cầu ta phải viết dòng này, nhưng nếu đường dẫn đặc biệt và quan trọng thì ta vẫn cần chú thích cụ thể cho trình thông dịch. Ngoài ra, dòng code này phải luôn ở dòng đầu tiên của chương trình, bắt đầu bằng #! – một câu lệnh đặc biệt để interpreter hiển thị cảnh báo. Trong ví dụ trên thì option -w dùng để kích hoạt cảnh báo ở phạm vi global.
print "Hello World"
là câu lệnh in văn bản ra màn hình, dấu chấm phẩy ở cuối cho interpreter biết vị trí kết thúc của câu lệnh. Cần lưu ý rằng mọi câu lệnh trong Perl đều cần có dấu chấm phẩy ở cuối để kết thúc. Dấu ngoặc kép " được dùng cho lệnh print để hiển thị ra màn hình.
Bây giờ hãy lưu lại đoạn script trên vào file firstprog.pl
.
Chạy chương trình Perl
Sau khi có được file firstprog.pl ở trên, ta có thể bắt đầu chạy thử chương trình này để xem kết quả.
Đối với Windows, nếu đã cài sẵn Strawberry thì bạn chỉ cần click vào nút Run. Hoặc cũng có thể viết dòng này vào command line để chạy script:
C:\> perl path\firstprog.pl
Nếu file không có sẵn trong đường dẫn hiện tại:
C:\> c:\perl\bin\perl.exe firstprog.pl
Đối với Linux/Unix, mở terminal rồi nhập dòng sau:
perl firstprog.pl
Nếu không chạy được chương trình, hãy nhập dòng sau để đảm bảo có đủ điều kiện chạy:
chmod +x firstprog.pl
Bây giờ chương trình đã có thể được thực thi:
./firstprog
Cài đặt module cpanminus
Module là những tập hợp code được dùng để thực hiện các tác vụ có nhiều hành động chung. Với module perl thì ta không cần phải viết lại code mỗi khi cần thực hiện một công việc nào đó nhiều lần.
Perl cũng hỗ trợ nhiều thư viện code mạnh mẽ, trong đó phổ biến nhất phải kể đến CPAN với rất nhiều module khác nhau cho từng mục đích sử dụng. Thư viện này cũng có một cộng đồng developer lớn, luôn liên tục cập nhật thêm nhiều module mới cho thư viện. Hầu hết các module đều được viết bằng Perl, một số module sử dụng XS (tức là được viết bằng C) thì yêu cầu người dùng có thêm một compiler của ngôn ngữ C.
Bên cạnh đó, cần lưu ý rằng có một số module phụ thuộc lẫn nhau và ta cần cài đặt đủ những thành phần phụ thuộc để có thể sử dụng.
Để download và cài đặt module từ CPAN, bạn đọc có thể cài đặt cpanminus bằng lệnh sau:
cpan App::cpanminus
Cài đặt module:
cpan -i <Module_Name>
Các biến trong Perl
Trong Perl có ba loại biến: scalar (vô hướng), array (mảng) và hash (băm).
Biến vô hướng
Đây là kiểu biến chỉ lưu trữ một giá trị duy nhất. Tên biến bắt đầu bằng kí tự $, theo sau đó là một định danh Perl (tên biến): $variable_name
Quy tắc đặt tên biến
Nếu đã biết về các ngôn ngữ lập trình khác thì chắc hẳn bạn cũng biết rằng mỗi ngôn ngữ lập trình sẽ có những quy tắc đặt tên biến riêng. Ngôn ngữ Perl cũng có ba quy tắc như sau:
- Tên biến bắt đầu bằng $.
- Tên biến chỉ chứa chữ số (0 đến 9), chữ cái (a-z và A-Z), dấu gạch dưới (_), không được phép bắt đầu bằng chữ số.
- Tên biến (sau dấu $) không được phép bắt đầu bằng chữ số.
Một số tên biến hợp lệ:
$var;
$Var32;
$vaRRR43;
$name_underscore_23;
Các tên biến không hợp lệ:
mohohoh # thiếu $
$ # phải có ít nhất 1 ký tự
$47x # ký tự thứ hai phải là số
$variable! # không được có ký tự ! trong tên
Dữ liệu kiểu số
Trong kiểu dữ liệu vô hướng, ta lại có thể chia thành hai loại: kiểu số (number) và kiểu chuỗi (string).
Dữ liệu kiểu số có thể là số nguyên (5, 6) hoặc số thập phân (123.56). Theo mặc định thì Perl xem số nguyên như là những số thập phân, tức là số 2 sẽ được ngầm hiểu là 2.0000.
Số nguyên có thể là số dương hoặc âm, đối với các số lớn thì ta cũng có thể thêm kí tự _ để ngăn cách các số hạng.
0;
-2542;
4865415484645;
4_865_415_484_645; # tuong tu voi so o tren, nhung su dung _ de ngan cach
Để gán một giá trị cho biến, ta có thể dùng toán tử =, khi đó biểu thức bên phải sẽ được gán cho biểu thức bên tay trái.
$size=15; # $szie nhan gia tri 15
$y = -7.78; # $y nhan gia tri -7.78
Dữ liệu kiểu xâu
Độ dài tối đa của một xâu trong Perl phụ thuộc vào bộ nhớ của máy tính. Về cơ bản thì xâu có kích thước không giới hạn và có thể bao gồm bất kỳ loại kí tự nào. Xâu ngắn nhất là xâu rỗng (không có ký tự), xâu dài nhất có kích thước bằng với dung lượng bộ nhớ của hệ thống.
Có hai loại xâu chính, thứ nhất là xâu được đặt trong cặp nháy đơn – dùng để đóng gói dữ liệu được hiểu một cách tường minh.
Ví dụ:
#!/usr/bin/perl
$num = 7;
$txt = 'it is $num';
print $txt;
Kết quả trả về sẽ là it is $num, vì $txt được đặt trong dấu nháy đơn nên $num sẽ được hiểu theo đúng biểu diễn của nó ở trong xâu.
Một loại xâu khác là xâu được đặt trong cặp nháy kép, dùng để đóng gói các dữ liệu cần được suy diễn trước khi xử lý.
Để hiểu rõ hơn, hãy xét thử ví dụ sau:
$num = 7;
$txt = "it is $num";
print $txt;
Output: it is 7
Ở đây, $txt được đặt trong dấu nháy kép nên xâu này sẽ diễn giải $num thành một giá trị của biến $num (tức là 7).
Ngoài ra, Perl cũng hỗ trợ toán tử nối “.” để nối hai hoặc nhiều xâu với nhau. Chẳng hạn:
#!/usr/bin/perl
$a = "Tom is";
$b = "favorite cat";
$c = $a ." mother's ". $b;
print $c;
Output: Tom is mother’s favorite cat
Trong đó, $a và $b là hai xâu được nối với nhau và lưu trữ vào biến $c bằng toán tử “.“
Chuyển đổi giữa chữ số và xâu
Theo mặc định, Perl sẽ tự chuyển chữ số thành xâu, nếu toán tử cần trả về một số thì Perl sẽ trả về giá trị kiểu số, còn ngược lại nếu toán tử cần giá trị xâu thì Perl sẽ trả về đúng kiểu giá trị đấy.
Ví dụ:
$string = "43";
$number = 28;
$result = $string + $number;
print $result;
Ở đây, $string đã được ép thành kiểu số nguyên để có thể cộng với $number, trả về giá trị là 71.
Access Modifier
Access modifier (chỉ định truy cập) hiểu một cách đơn giản là phạm vi của biến. Ta có thể khai báo các biến vô hướng ở bất kỳ đâu trong chương trình, nhưng bắt buộc phải chỉ định một access modifier cho nó.
Có ba loại modifier trong Perl:
- 1. my – cho phép khai báo bất kỳ biến nào trong một block cụ thể (tức là trong cặp dấu ngoặc nhọn).
Ví dụ:
#!/usr/bin/perl
my $var=5;
if(1)
{
my $var_2 =$var;
}
print $var_2;
Đoạn code trên không hiển thị output nào ra màn hình, bởi vì biến $var_2 được khai báo bên trong block, trong khi biến $var thì lại được khai báo bên ngoài. Do đó, biến $var (khai báo bên ngoài) sẽ có quyền truy cập vào block if, nhưng chiều ngược lại thì không đúng. Vì vậy có thể hiểu rằng biến $var_2 không hề tồn tại ở bên ngoài block if.
- 2. local – cho phép gán nhiều giá trị khác nhau cho cùng một biến.
Giả sử ta có một biến $a nhận giá trị bằng 5, với modifier local thì ta có thể gán $a thành bất kỳ giá trị nào khác để sử dụng trong một phạm vi cục bộ mà không hề ảnh hưởng đến giá trị gốc của $a.
#!/usr/bin/perl
$var = 5;
{
local $var = 3;
print "local,\$var = $var \n";
}
print "global,\$var = $var \n";
Output:
local, $var = 3
global, $var = 5
- 3. our – cho phép sử dụng biến trên toàn bộ package.
Giả sử ta có một module hoặc package Perl tên là test.pm, với một biến $var được khai báo theo phạm vi our. Khi đó, biến này có thể được truy cập bởi bất kỳ script nào có trong package này.
Mảng trong Perl
Mảng (array) là một kiểu biến đặc biệt, dùng để lưu trữ dữ liệu trong dạng một danh sách. Trong đó mỗi phần tử có thể được truy cập thông qua chỉ số, đồng thời chỉ số này cũng là đơn nhất cho mọi phần tử. Biến mảng này có thể lưu trữ số, xâu, giá trị thập phân,… Mảng trong Perl được khai bào bằng kí tự @, theo sau là tên của mảng cần khai báo. Ví dụ: my @array
my @array=(a, b, c, d);
print @array;
Output: abcd
Ở ví dụ trên là một mảng có 4 phần tử, chỉ mục của mảng bắt đầu từ số 0 và kết thúc tại kích thước lớn nhất được khai báo (trong trường hợp này là 3).
Mảng tuần tự
Đúng như tên gọi, mảng tuần tự cho phép ta lưu trữ dữ liệu một cách tuần tự. Giả sử ta cần lưu trữ một chuỗi số từ 1-10, hoặc một chuỗi ký tự từ a-z thì thay vì phải nhập từng ký tự một, ta hoàn toàn có thể khai báo một cách đơn giản abwfng mảng tuần tự như sau:
@numbers=(1..10);
print @numbers;
Output: 12345678910
Kích thước mảng trong Perl
Có hai cách chung để tìm được kích thước của mảng:
Cách 1: dùng hàm có sẵn
@array= qw/a b c d e/;
print $size=scalar (@array);
Cách 2: dựa vào index lớn nhất của mảng
@array= qw/a b c d e/;
print $size=scalar (@array);
print "\n";
print $size=$#array + 1;
Output: 5
Lưu ý: qw() là hàm khởi tạo một danh sách các từ.
Mảng động
Những mảng ở các ví dụ trên được gọi là mảng tĩnh (static array), có thể khai báo khi người dùng đã biết trước được kích thước của mảng cần tạo.
Mặt lại, mảng động (dynamic array) lại cho phép khai báo mà không cần chỉ định trước bất kỳ giá trị nào, các giá trị sẽ được lưu trữ trong thời gian chạy (runtime). Ví dụ:
my $string="This is a kind of dynamic array";
my @array;
@array=split('a',$string);
foreach(@array)
{
print "$_ \n”;
# This is a special variable which stores the current value.
}
Output:
This is
kind of dyn
mic
rr
y
Lưu ý: hàm split() dùng để chia nội dung thành nhiều xâu rồi lưu trữ vào mảng, dựa trên phần tử phân cách là ký tự a.
Push, pop, shift và unshift trong mảng
Đây là những hàm có thể dùng để thêm/xoá phần tử khi thao tác với mảng. Cụ thể:
- Push: thêm phần tử vào cuối mảng
- Pop: xoá phần tử ở cuối mảng
- Shift: xoá phần tử đầu tiên của mảng
- Unshift: thêm một phần từ vào đầu mảng
Ví dụ:
@days = ("Mon","Tue","Wed");
print "1st : @days\n";
push(@days, "Thu"); # thêm 1 phần tử vào cuối mảng
print "2nd when push : @days\n";
unshift(@days, "Fri"); # thêm 1 phần tử vào đầu mảng
print "3rd when unshift : @days\n";
pop(@days);
print "4th when pop : @days\n"; # xoá 1 phần tử ở cuối mảng
shift(@days); # xoá 1 phần tử ở đâu mảng
print "5th when shift : @days\n";
#
# output:
1st : Mon Tue Wed
2nd when push : Mon Tue Wed Thu
3rd when unshift : Fri Mon Tue Wed Thu
4th when pop : Fri Mon Tue Wed
5th when shift : Mon Tue Wed
Perl Hash
Ở những phần trên, chúng ta đã tìm hiểu về biến vô hướng và mảng. Các biến vô hướng chỉ lưu trữ số nguyên hoặc xâu; còn mảng về cơ bản chỉ là một tập hợp các biến vô hướng và cho phép truy cập thông qua chỉ số. Bây giờ giả sử ta cần lưu trữ hàng trăm, hàng nghìn biến vô hướng thì việc ghi nhớ chỉ số và phân bổ dữ liệu sẽ vô cùng khó khăn.
Hash (băm) là một cấu trúc dữ liệu cho phép lưu trữ số lượng biến vô hướng không giới hạn, tuy nhiên hash không truy cập dựa trên chỉ số mà lưu trữ những cặp key-value. Một hash một có thể được khai báo theo cú pháp %hash_name. Xét ví dụ về một mảng lưu trữ tên và tuổi của ba người như sau:
@array=('Sainath',23,'Krishna',24,'Shruthi',25);
print @array;
Output:
<kbd>Sainath33Krishna24Shruthi25</kbd>
Dựa vào output này, việc xác định tên và tuổi của từng cá nhân là tương đối khó khăn. Hơn nữa, đây chỉ là một ví dụ nhỏ, hãy tưởng tượng công việc sẽ như thế nào khi số lượng phần tử lên đến hàng trăm, hàng nghìn.
Ví dụ tương tự với cấu trúc hash:
print %hash=( 'Sainath' => 23, 'Krishna' => 24, 'Shruthi' => 25); # Khởi tạo hash
print %hash=('Sainath',23,'Krishna',24,'Shruthi',25);# Gán dữ liệu theo kiểu danh sách
Output: Sainath33Krishna24Shruthi25Sainath33Krishna24Shruthi25
Mỗi phần tử trong một hash có thể được truy cập thông qua key của nó, mỗi key sẽ có một ánh xạ tương ứng đến giá trị của phần tử.
Để in tuổi của một người bất kỳ trong mảng, ta chỉ cần dựa vào tên của người đó:
print $hash{'Krishna'};
Thêm phần tử vào hash
Giả sử ta đã có sẵn một hash %newHash, bây giờ bạn có thể thêm phần tử vào hash này như sau:
$newHash{'Jim'}=25;
$newHash{'John'}=26;
$newHash{'Harry'}=27;
print %newHash;
Output:
<kbd>Jim25John26Harry27</kbd>
Xoá key trong hash
Perl có sẵn một hàm delete được dùng như sau:
delete $newHash{'Jim'}; # xoá một phần tử khỏi hash
Để xoá mọi phần tử khỏi hash, ta có thể gán nó thành giá trị null: %newHash=();
Câu lệnh điều kiện
Câu lệnh điều kiện là những mệnh đề cho phép kiểm tra các điều kiện, trường hợp cần thoả mãn trong code. Perl hỗ trợ hai loại câu lệnh điều kiện là if và unless.
Câu lệnh If
Khối lệnh sẽ được thực hiện nếu điều kiện trong câu lệnh If là đúng:
my $a=5;
if($a==5)
{
print "The value is $a";
}
Output: 5
Câu lệnh If Else
Trong ví dụ ở trên, nếu giá trị của $a là 5 thì chương trình sẽ in ra dòng trong khối lệnh bên dưới. Tuy nhiên đoạn code trên sẽ không hiển thị gì nếu giá trị của $a không phải là 5. Khi đó ta có thể bổ sung thêm điều kiện bằng else như sau:
my $a=10;
if($a==5)
{
print "The values is $a ---PASS";
}
else
{
print "The value is $a ---FAIL";
}
Output: The value is 10 —FAIL
Else if
Mở rộng hơn nữa là điều kiện else if, cho phép kiểm tra thêm một điều kiện khác nếu điều kiện trước đó là sai:
my $a=5;
if($a==6)
{
print "Executed If block -- The value is $a";
}
elsif($a==5)
{
print "Executed elsif block --The value is $a";
}
else
{
print "Executed else block – The value is $a";
}
Output: Executed elsif block –The value is 5
If lồng nhau
Perl cũng cho phép lồng nhiều câu lệnh If vào nhau:
my $a=11; #Change values to 11,2,5 and observe output
if($a<10){
print "Inside 1st if block";
if($a<5){
print "Inside 2nd if block --- The value is $a";
}
else{
print " Inside 2nd else block --- The value is $a";
}
}
else{
print "Inside 1st else block – The value is $a";
}
Output: Inside 1st else block – The value is 11
Unless
Ngược lại với điều kiện If ở trên, khối lệnh trong câu lệnh điều kiện Unelss sẽ được thực hiện nếu điều kiện là sai. Ví dụ:
my $a=5;
unless($a==5)
{
print "Inside the unless block --- The value is $a";
}
else
{
print "Inside else block--- The value is $a";
}
Output: Inside 1st else block – The value is 5
Cấu trúc vòng lặp
Perl programming hỗ trợ các cấu trúc điều khiển (control structure) tương tự như nhiều ngôn ngữ lập trình khác: for, foreach, while và until. Các cấu trúc này được sử dụng để thực thi một đoạn code nào đó lặp đi lặp lại nhiều lần.
Vòng lặp For
Khối lệnh trong vòng lặp for sẽ thực thi cho đến khi điều kiện được thoả mãn. Chẳng hạn:
my @array=(1..10);
for(my $count=0;$count<10;$count++)
{
print "The array index $count value is $array[$count]";
print "\n";
}
Output:
The array index 0 value is 1
The array index 1 value is 2
The array index 2 value is 3
The array index 3 value is 4
The array index 4 value is 5
The array index 5 value is 6
The array index 6 value is 7
The array index 7 value is 8
The array index 8 value is 9
The array index 9 value is 10
Vòng lặp for ở trên có cấu trúc như sau: for(khởi tạo; điều kiện; bước nhảy).
Ngoài ra ta cũng có thể dùng cú pháp sau:
for(1..10)
{
print "$_ n";
print "\n";
}
Cấu trúc Foreach
Câu lệnh for each có thể được dùng tương tự như for, nhưng không có điều kiện và bước nhảy.
Ví dụ:
my @array=(1..10);
foreach my $value (@array)
{
print " The value is $value\n";
}
Output:
The value is 1
The value is 2
The value is 3
The value is 4
The value is 5
The value is 6
The value is 7
The value is 8
The value is 9
The value is 10
Câu lệnh foreach nhận từng giá trị trong mảng rồi gán vào biến $var tại mỗi vòng lặp.
Vừa rồi là các ví dụ làm việc với mảng, vậy cấu trúc vòng lặp có thể được áp dụng cho hash hay không?
y %hash=( 'Tom' => 23, 'Jerry' => 24, 'Mickey' => 25);
foreach my $key (keys %hash)
{
print "$key \n";
}
Output:
Mickey
Tom
Jerry
keys là một hàm có sẵn trong Perl, cho phép truy cập nhanh vào danh sách các key của hash. Tương tự, ta cũng có thể dùng hàm values để truy cập vào giá trị của hash như sau:
my %hash=( 'Tom' => 23, 'Jerry' => 24, 'Mickey' => 25);
foreach my $value(values %hash) # This will push each value of the key to $value
{
print " the value is $value \n";
}
Output:
the value is 24
the value is 23
the value is 25
Vòng lặp while
Trong cấu trúc vòng lặp while, khối lệnh sẽ được thực hiện cho đến khi điều kiện là đúng, và chỉ thoát nếu điều kiện sai. Cụ thể được minh hoạ qua biểu đồ sau:
#!/usr/bin/perl
$guru99 = 0;
$luckynum = 7;
print "Guess a Number Between 1 and 10\n";
$guru99 = <STDIN>;
while ($guru99 != $luckynum)
{
print "Guess a Number Between 1 and 10 \n ";
$guru99 = <STDIN>;
}
print "You guessed the lucky number 7"
Trong ví dụ trên, chương trình sẽ liên tục hiển thị Guess a Number Between 1 and 10 và chỉ dừng nếu người dùng nhập vào đúng số 7.
Cấu trúc do-while trong Perl
Vòng lặp do while luôn được thực thi ít nhất một lần, thậm chí nếu điều kiện trong phần while là sai.
Ví dụ:
$guru99 = 10;
do {
print "$guru99 \n";
$guru99--;
}
while ($guru99 >= 1);
print "Now value is less than 1";
Output:
10
9
8
7
6
5
4
3
2
1
Now value is less than 1
Câu lệnh until
Khối lệnh until tương tự như unless, nhưng code sẽ được thực thi nếu điều kiện trong khối until là sai.
Ví dụ:
print "Enter any name \n";
my $name=<STDIN>;
chomp($name);
until($name ne 'sai')
{
print "Enter any name \n";
$name=<STDIN>;
chomp($name);
}
Trong đoạn code trên, chương trình sẽ yêu cầu người dùng nhập input và sẽ chỉ thoát nếu người dùng nhập tên khác sai.
print "Enter any name \n";
my $name=<STDIN>;
chomp($name);
until($name ne 'sai')
{
print "Enter any name \n";
$name=<STDIN>;
chomp($name);
}
Output:
Enter any name sai
Cấu trúc do-until
Do until được dùng khi ta cần mội điều kiện trả về sai, đồng thời nên được thực thi ít nhất một lần.
print "Enter any name \n";
my $name=<STDIN>;
chomp($name);
do
{
print "Enter any name \n";
$name=<STDIN>;
chomp($name);
}until($name ne 'sai');
Output:
Enter any name Howard
Enter any name Sheldon
Enter any name sai
Các toán tử
Trong khoa học máy tính, toán tử chỉ một hành động có thể được thực hiện trên một số tập hợp biến hoặc giá trị mà máy tính có thể hiểu được. Perl đã kết hợp hầu như mọi toán tử từ ngôn ngữ lập trình C, và hỗ trợ khá nhiều loại toán tử so với các ngôn ngữ khác. Toán tử trong Perl được phân loại thành: Số học, Logic, toán tử quan hệ và phép gán.
Toán tử gán
Đúng như tên gọi, toán tử này có nhiệm vụ gán các giá trị cho biến, nhưng đồng thời cũng có thể thực hiện một số toán tử số học khác rồi mới gán vào biến.
Toán tử logic và quan hệ
Perl sử dụng các toán tử logic để so sánh chữ số và các xâu với nhau, chủ yếu được dùng trong các câu lệnh điều kiện.
Biểu thức chính quy
Biểu thức chính quy (regular expression – regex) trong Perl có thể khớp các mẫu string trong một hay một nhóm các câu lệnh. Regex chủ yếu được ứng dụng trong phân tích cú pháp văn bản, khớp mẫu,…
Các toán tử regex phổ biến trong Perl:
- Khớp (match):
-m//
- Thay thế (substitute):
-s///
- Chuyển ngữ (transliterate):
-tr///
Trước hết hãy xét thử một ví dụ chung như sau: người dùng đưa input trong quá trình thực thi script, và chương trình cần kiểm tra người dùng có nhập một tên nào đấy hay không.
Bây giờ ta có thể dùng regex để trích tên ra như sau:
my $userinput="Guru99 Rocks";
if($userinput=~m/.*(Guru99).*/)
{
print "Found Pattern";
}
else
{
print "unable to find the pattern";
}
Output: Found Pattern
Ở ví dụ trên, /.*(Guru99).*/.* khớp mọi kí tự có trong xâu, . dùng để chỉ bất kỳ kí tự nào (kể cả space).
Toán tử khớp
Toán tử này dùng để khớp một xâu trong câu lệnh hoặc biến.
my $var="Hello this is perl";
if($var=~m/perl/)
{
print "true";
}
else
{
print "False";
}
Output: true
Perl sẽ tìm kiếm phần văn bản có trong cặp dấu / / bên trong xâu, miễn là xuất hiện thì sẽ trả về true.
Toán tử thay thế
Được dùng để tìm và thay thế bất kỳ ký tự nào (kể cả null):
my $a="Hello how are you";
$a=~s/hello/cello/gi;
print $a;
Output: cello how are you
Toán tử phiên dịch
Tương tự như toán tử thay thế, nhưng không sử dụng regex mà chỉ truyền trực tiếp giá trị cần thay thế.
my $a="Hello how are you";
$a=~tr/hello/cello/;
print $a;
Output: Hello how are you
File I/O trong Perl
Perl được thiết kế để xử lý các thao tác I/O cho file vô cùng hiệu quả. Ưu điểm lớn của Perl chính là khả năng phân tích cú pháp và xử lý file với nhiều hàm, toán tử có sẵn.
Về cơ bản thì các thao tác với file được thực hiện qua FILEHANDLE – cần phải được định nghĩa khi mở file để đọc hoặc viết.
Mở file trong Perl
Perl có sẵn một hàm open() để mở file:
open(FILEHANDLE, "tên file hoặc đường dẫn đến file");
Đọc và viết file trong Perl
Perl có ba chế độ chính khi làm việc với file: đọc, viết hoặc chèn (append).
Read – open(my $fh,"<tên file hoặc đường dẫn đến file");
Write – open(my $fh,">tên file hoặc đường dẫn đến file");
Append – open(my $fh,">>tên file hoặc đường dẫn đến file");
Một số chế độ khác:
Subroutine trong Perl
Subroutine trong Perl cũng tương tự như hàm trong nhiều ngôn ngữ lập trình khác. Bên cạnh các hàm có sẵn như print, chop,… ta cũng có thể tự viết các hàm (subroutine) cho riêng mình. Hàm có thể được viết ở bất kỳ đâu trong chương trình, nhưng thường nên được đặt ở đầu hoặc cuối code.
Ví dụ:
sub subroutine_name
{
Statements…; # ví dụ về subroutine
}
Để sử dụng subroutine, ta gọi tên kèm với tiền tố & như sau:
sub display
{
print "this is a subroutine";
}
display(); # gọi subroutine
Truyền tham số và đối số
Hầu hết các subroutine trong Perl đều có các tham số nhất định. Để truyền đối số vào subroutine ta có thể thực hiện như sau:
sub display
{
my $var=@_; # @_ is a special variable which stores the list of arguments passed.
print "$var is the value passed";
}
display(2,3,4); #this is how we need to pass the arguments.
Output: 3 is the value passed
Trong đó, @_ là một biến mảng đặc biệt, dùng để lưu trữ các đối số được truyền vào trong subroutine.
Shift trong Perl
Perl cho phép sử dụng keyword shift để chuyển từng tham số thành một biến, hoặc $_[0], $_[1],…. (từng phần tử riêng lẻ trong mảng @_). Ví dụ:
sub display
{
my $var=shift;
print "$var is passed";
}
display("hello");
Output: hello is passed
Dễ thấy rằng subroutine được ứng dụng phổ biến nhất trong lập trình hướng đối tượng hoặc dùng để tái sử dụng code vô cùng hiệu quả.
Chức năng chính của subroutine là thực hiện một số tác vụ rồi trả về kết quả của code có thể tái sử dụng:
Bên cạnh đó, ta cũng có thể trả về giá trị từ subroutine bằng từ khoá return:
sub add
{
my $a=shift;
my $b=shift;
return($a+$b);
}
my $result=add(5,6);
print $result;
Output: 11
Trong đó $result lưu trữ giá trị của tổng $a và $b.
Tiêu chuẩn code trong Perl
Mỗi lập trình viên đều có cách viết code khác nhau, tuy nhiên ai cũng cần tuân theo một số tiêu chuẩn code của từng ngôn ngữ lập trình. Tiêu chuẩn code cho phép việc quản trì trở nên hiệu quả hơn, hạn chế bug, cải thiện khả năng đọc hiểu,…
Dưới đây là một số tiêu chuẩn cơ bản của ngôn ngữ lập trình này:
- Sử dụng module strict và warnings.
- Xoá các biến không sử dụng.
- Tên biến dễ hiểu.
- Cung cấp tài liệu khi viết script.
- Không hardcode các giá trị mà nên tìm nạp động, hoặc yêu cầu người dùng nhập khi chạy.
- Tối đa việc tái sử dụng code.
- Luôn khởi tạo biến.
- Kiểm tra code trả về khi hệ thống gọi.
- Subroutine luôn trả về giá trị.
- Subroutine cần được viết với comment và tài liệu phù hợp, có tên mô tả đúng ý nghĩa của subroutine.
Dưới đây là một ví dụ về code tuân theo các tiêu chuẩn kể trên:
#######################################################################
Program to read the file content
# Date: 22-2-2013
# Author : Guru99
########################################################################
#!/usr/bin/perl
use strict;
use warnings;
my $line;
open FR, "file.txt" || die("Cannot open the file $!");
while ($line=<FR>)
{
print $line;
} # Looping file handler to print data
Xử lý lỗi trong Perl
Exception là gì?
Exception (ngoại lệ) là một sự kiện xảy ra trong quá trình thực thi chương trình, làm trì hoãn hoặc dừng hẳn chương trình.
Xử lý lỗi
Error handling (xử lý lỗi) là một công việc mà mọi lập trình viên cần phải xử lý được. Perl cũng cung cấp nhiều kỹ thuật xử lý lỗi khác nhau.
Trước tiên ta cần kiểm tra code để tìm ra nguyên nhân gây lỗi. Với sự kiện system call thì return status (trạng thái trả về) sẽ được lưu trong hai biến đặc biệt là $? và $!:
- $! – bắt số lỗi liên quan đến thông báo lỗi.
- $? – giữ hàm system().
Sử dụng các toán tử logic
Giả sử ta có một đoạn code dùng để mở file (chế độ read) như sau:
open(FH,"<test.txt");
Vấn đề ở đây là, nếu chẳng may file này không tồn tại thì sao?
open(FH,"<test.txt") or die("File not exists $!"); # This will perl exit the program if the file not exists.
open(FH,"<test.txt") or warn ("File not exists $!"); # This will print a warning message on STDERR
Ở ví dụ trên, ta đã dùng toán tử logic or để xử lý lỗi trong system call.
Eval trong Perl
Hàm eval trong Perl cho phép xử lý các lỗi biên dịch, lỗi runtime và các lỗi nghiêm trọng khác. Giả sử ta gọi một subroutine không được định nghĩa trong script, thì script nãy sẽ ngừng với thông báo lỗi có dạng “undefined subroutine &XYZ”.
Hàm eval có thể ở dạng biểu thức hoặc khối code, một cách sử dụng khối code phổ biến là khi ta cần load module mang tính đặc thù với hệ điều hành trong runtime.
Ví dụ: Xử lý lỗi chia cho số 0 bằng eval:
$a=5;
$b=0;
eval
{
'$result=$a/$b';
}
if($@)
{
print "$@"; # All the error codes returned by evals will get stored in $@.
}
Output:
syntax error at C:\Users\XYZ\Text.pl line 8, near “)
{“
Try, catch và finally trong Perl
Theo mặc định thì Perl không hỗ trợ các khối code try, catch và finally như nhiều ngôn ngữ lập trình khác. Tuy nhiên ta vẫn hoàn toàn có thể load một module Perl bên ngoài để sử dụng.
Sử dụng:Tiny;
Sử dụng try-catch:
try
{
die "Die now";
}
catch
{
warn "caught error: $_"; # not $@
};
Finally:
my $y;
try
{
die 'foo'
}
finally
{
$y = 'bar'
};
try
{
die 'Die now'
}
catch
{
warn "Returned from die: $_"
}
finally
{
$y = 'gone'
};
Output: foo at C:\Users\XYZ\Text.pl line 4.
Module và Package trong Perl
Trong Perl, package (hay còn gọi là namespace) có các biến đơn nhất được sử dụng như những cấu trúc hash, array, scalar và subroutine. Mặt khác, module lại là một tập hợp các code có thẻ sử dụng lại, tức là nơi để viết subroutine.
Module
Các module tiêu chuẩn được cài đặt chung với Perl trên bất kỳ hệ thống nào. Một module khi được load trong bất kỳ script nào cũng sẽ export mọi biến toàn cục và subroutine của nó. Những subroutine này có thể gọi trực tiếp như được khai báo trong script.
Các module trong Perl có thể được viết với phần mở rộng .pm, ví dụ như vietnix.pm, và module phải bắt đầu bằng keyword package Foo.
Ví dụ về một module cơ bản có trong Perl:
#!/usr/bin/perl
package Arithmetic;
sub add
{
my $a=$_[0];
my $b=$_[1];
return ($a+$b);
}
sub subtract
{
my $a=$_[0];
my $b=$_[1];
return ($a-$b);
}
1;
Output: không có
Lưu ý rằng để sử dụng đươc module Perl thì ta cần đặt nó trong thư mục hiện đang làm việc. Ta cũng có thể load một module bằng keyword require hoặc use. Trong đó require sẽ load module trong thời gian chạy, còn use sẽ load module trong thời gian biên dịch.
#!/usr/bin/perl
require
Arithmetic;
print Arithmetic::add(5,6);
print Arithmetic:: subtract (5,6);
Lập trình hướng đối tượng với Perl
Trong phần cuối cùng của bài viết này, Vietnix sẽ bàn luận về khía cạnh lập trình hướng đối tượng của Perl. Trước tiên, hãy hiểu rõ đối tượng là gì?
Đối tượng là một thể hiện (instance) của một lớp (class) để người dùng có thể truy cập, thay đổi và định vị một số dữ liệu trong bất kỳ module Perl nào. Do đó, package, biến và subroutine trong Perl hoạt động tương tự như lớp, đối tượng và phương thức trong các ngôn ngữ lập trình hướng đối tượng khác.
Class
Ta đã tìm hiểu về cách tạo module ở phần trên. Mục đích của một class là dùng để lưu trữ các biến và phương thức. Một module có subroutine, đóng vai trò như những phương thức.
Constructor
Constructor trong Perl là một phương thức có nhiệm vụ thực thi và trả về một tham chiếu với tên module được gắn thẻ cho tham chiếu.
#!/usr/bin/perl
package Arithmetic;
sub new
{
my $class=shift;
my $self={};
bless $self, $class;
return $self;
}
sub add
{
my $self= shift;
my $a=$_[0];
my $b=$_[1];
return ($a+$b);
}
sub subtract
{
my $self= shift;
my $a=$_[0];
my $b=$_[1];
return ($a-$b);
}
1;
Phương tức new được dùng như một constructor, có nhiệm vụ tạo một đối tượng và trả về cho script đang gọi constructor này.
#!/usr/bin/perl
use Arithmetic;
my $obj= Arithmetic->new();
my $result= $obj->add(5,6);
print "$result";
$result = $obj->subtract(6,5);
print "$result";
Ở đây thì ta cần phải hiểu rõ cách một đối tượng được tạo. Khi tạo một đối tượng cho class, ta cần sử dụng tên đầy đủ của class này. Giả sử rằng class được đặt trong lib\Math\Arithmetic.pm. Bây giờ khi cần truy cập vào class này từ thư mục lib thì ta cần cung cấp cả đường dẫn đầy đủ đến class khi gọi trong script.
my $obj = lib::Math::Arithmetic->new();
Lời kết
Bài viết này đã đề cập đến hầu hết những khái niệm cơ bản nhất trong Perl. Khả năng của Perl vẫn còn trải rộng trên nhiều ứng dụng khác nhau, nhưng không thể được gói trọn hết vào giới hạn của một bài viết. Hãy chờ đợi những phần tiếp theo từ Vietnix nhé!
ANH ơi cho e hỏi với ạ. câu lệnh này nghĩa là gì ạ. require ‘gyousuu_const_ppcnt.pl’;
em có tìm thì không thấy file này trong source code là sao ạ.”gyousuu_const_ppcnt.pl”