Perl - 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

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 ($) và 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ừ 0, vì vậy để truy cập phần tử đầu tiên, bạn cần đưa 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, thay vì đầ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 lại 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 để liên kết lại các phần tử của mảng và tạo thành một chuỗi vô hướng dài. 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 đơn 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 đã 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.

$ [Biến đặc biệt

Cho đến nay, bạn đã thấy biến đơn giản mà chúng tôi đã xác định trong các chương trình của mình và sử dụng chúng để lưu trữ và in các giá trị vô hướng và mảng. Perl cung cấp nhiều biến đặc biệt, có ý nghĩa được xác định trước.

Chúng tôi có một biến đặc biệt, được viết là $[. Biến đặc biệt này là một biến vô hướng chứa chỉ số đầu tiên của tất cả các mảng. Bởi vì mảng Perl có lập chỉ mục dựa trên 0, $ [hầu như luôn luôn bằng 0. Nhưng nếu bạn đặt $ [thành 1 thì tất cả các mảng của bạn sẽ sử dụng lập chỉ mục dựa trên. Không nên sử dụng bất kỳ lập chỉ mục nào khác ngoài số không. Tuy nhiên, hãy lấy một ví dụ để hiển thị việc sử dụng $ [biến -

#!/usr/bin/perl

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

# Let's reset first index of all the arrays.
$[ = 1;

print "Food at \@foods[1]: $foods[1]\n";
print "Food at \@foods[2]: $foods[2]\n";

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

Foods: pizza steak chicken burgers
Food at @foods[1]: pizza
Food at @foods[2]: steak

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