Perl - อาร์เรย์

อาร์เรย์คือตัวแปรที่จัดเก็บรายการค่าสเกลาร์ที่เรียงลำดับ ตัวแปรอาร์เรย์นำหน้าด้วยเครื่องหมาย "at" (@) ในการอ้างถึงองค์ประกอบเดียวของอาร์เรย์คุณจะใช้เครื่องหมายดอลลาร์ ($) พร้อมชื่อตัวแปรตามด้วยดัชนีขององค์ประกอบในวงเล็บเหลี่ยม

นี่คือตัวอย่างง่ายๆของการใช้ตัวแปรอาร์เรย์ -

#!/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";

ที่นี่เราใช้เครื่องหมาย Escape (\) ก่อนเครื่องหมาย $ เพื่อพิมพ์ Perl อื่นจะเข้าใจว่าเป็นตัวแปรและจะพิมพ์ค่าของมัน เมื่อดำเนินการสิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -

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

ใน Perl มักใช้คำศัพท์ List และ Array ราวกับว่าใช้แทนกันได้ แต่รายการคือข้อมูลและอาร์เรย์เป็นตัวแปร

การสร้างอาร์เรย์

ตัวแปรอาร์เรย์นำหน้าด้วยเครื่องหมาย @ และเติมข้อมูลโดยใช้วงเล็บหรือตัวดำเนินการ qw ตัวอย่างเช่น -

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

บรรทัดที่สองใช้ตัวดำเนินการ qw // ซึ่งส่งคืนรายการสตริงโดยแยกสตริงที่คั่นด้วยช่องว่าง ในตัวอย่างนี้สิ่งนี้นำไปสู่อาร์เรย์สี่องค์ประกอบ องค์ประกอบแรกคือ 'this' และสุดท้าย (ที่สี่) คือ 'array' ซึ่งหมายความว่าคุณสามารถใช้บรรทัดต่างๆได้ดังนี้ -

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

คุณยังสามารถเติมอาร์เรย์โดยกำหนดค่าแต่ละค่าทีละรายการดังนี้ -

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

การเข้าถึงองค์ประกอบอาร์เรย์

เมื่อเข้าถึงแต่ละองค์ประกอบจากอาร์เรย์คุณต้องนำหน้าตัวแปรด้วยเครื่องหมายดอลลาร์ ($) จากนั้นต่อท้ายดัชนีองค์ประกอบภายในวงเล็บเหลี่ยมหลังชื่อของตัวแปร ตัวอย่างเช่น -

#!/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";

สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -

Mon
Tue
Wed
Sun
Sun
Mon

ดัชนีอาร์เรย์เริ่มต้นจากศูนย์ดังนั้นในการเข้าถึงองค์ประกอบแรกคุณต้องให้ 0 เป็นดัชนี คุณยังสามารถให้ดัชนีเชิงลบซึ่งในกรณีนี้คุณจะเลือกองค์ประกอบจากส่วนท้ายแทนที่จะเป็นจุดเริ่มต้นของอาร์เรย์ ซึ่งหมายถึงสิ่งต่อไปนี้ -

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

อาร์เรย์หมายเลขลำดับ

Perl เสนอทางลัดสำหรับตัวเลขและตัวอักษรตามลำดับ แทนที่จะพิมพ์แต่ละองค์ประกอบเมื่อนับถึง 100 เช่นเราสามารถทำได้ดังนี้ -

#!/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

ที่นี่ double dot (.. ) เรียกว่า range operator. สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -

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

ขนาดอาร์เรย์

ขนาดของอาร์เรย์สามารถกำหนดได้โดยใช้บริบทสเกลาร์บนอาร์เรย์ - ค่าที่ส่งคืนจะเป็นจำนวนองค์ประกอบในอาร์เรย์ -

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

ค่าที่ส่งคืนจะเป็นขนาดทางกายภาพของอาร์เรย์เสมอไม่ใช่จำนวนองค์ประกอบที่ถูกต้อง คุณสามารถสาธิตสิ่งนี้และความแตกต่างระหว่างสเกลาร์ @array และ $ # array โดยใช้ส่วนนี้มีดังนี้ -

#!/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";

สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -

Size: 51
Max Index: 50

มีเพียงสี่องค์ประกอบในอาร์เรย์ที่มีข้อมูล แต่อาร์เรย์มีความยาว 51 องค์ประกอบโดยมีดัชนีสูงสุด 50

การเพิ่มและการลบองค์ประกอบใน Array

Perl มีฟังก์ชันที่มีประโยชน์มากมายในการเพิ่มและลบองค์ประกอบในอาร์เรย์ คุณอาจมีคำถามว่าฟังก์ชันคืออะไร? จนถึงตอนนี้คุณได้ใช้printเพื่อพิมพ์ค่าต่างๆ ในทำนองเดียวกันมีฟังก์ชันอื่น ๆ อีกมากมายหรือบางครั้งเรียกว่ากิจวัตรย่อยซึ่งสามารถใช้สำหรับฟังก์ชันอื่น ๆ ได้

ซีเนียร์ ประเภทและคำอธิบาย
1

push @ARRAY, LIST

พุชค่าของรายการไปที่ส่วนท้ายของอาร์เรย์

2

pop @ARRAY

ปิดและส่งคืนค่าสุดท้ายของอาร์เรย์

3

shift @ARRAY

เลื่อนค่าแรกของอาร์เรย์ออกและส่งคืนค่าโดยย่ออาร์เรย์ให้สั้นลง 1 และย้ายทุกอย่างลง

4

unshift @ARRAY, LIST

Prepends รายการที่ด้านหน้าของอาร์เรย์และส่งกลับจำนวนองค์ประกอบในอาร์เรย์ใหม่

#!/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";

สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -

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

การแบ่งองค์ประกอบอาร์เรย์

คุณยังสามารถแยก "สไลซ์" จากอาร์เรย์ - นั่นคือคุณสามารถเลือกมากกว่าหนึ่งรายการจากอาร์เรย์เพื่อสร้างอาร์เรย์อื่น

#!/usr/bin/perl

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

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

print "@weekdays\n";

สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -

Thu Fri Sat

ข้อกำหนดสำหรับชิ้นส่วนต้องมีรายการดัชนีที่ถูกต้องไม่ว่าจะเป็นค่าบวกหรือค่าลบแต่ละรายการคั่นด้วยเครื่องหมายจุลภาค เพื่อความรวดเร็วคุณยังสามารถใช้ไฟล์.. ตัวดำเนินการช่วง -

#!/usr/bin/perl

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

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

print "@weekdays\n";

สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -

Thu Fri Sat

การเปลี่ยนองค์ประกอบอาร์เรย์

ตอนนี้เราจะแนะนำอีกหนึ่งฟังก์ชันที่เรียกว่า splice()ซึ่งมีไวยากรณ์ต่อไปนี้ -

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

ฟังก์ชันนี้จะลบองค์ประกอบของ @ARRAY ที่กำหนดโดย OFFSET และ LENGTH และแทนที่ด้วย LIST หากระบุไว้ สุดท้ายจะส่งคืนองค์ประกอบที่ลบออกจากอาร์เรย์ ต่อไปนี้เป็นตัวอย่าง -

#!/usr/bin/perl

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

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

สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -

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

ที่นี่การแทนที่จริงเริ่มต้นด้วยหมายเลข 6 หลังจากนั้นห้าองค์ประกอบจะถูกแทนที่จาก 6 เป็น 10 ด้วยตัวเลข 21, 22, 23, 24 และ 25

แปลงสตริงเป็นอาร์เรย์

มาดูอีกหนึ่งฟังก์ชันที่เรียกว่า split()ซึ่งมีไวยากรณ์ต่อไปนี้ -

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

ฟังก์ชันนี้จะแยกสตริงออกเป็นอาร์เรย์ของสตริงและส่งกลับ หากระบุ LIMIT ให้แยกออกเป็นฟิลด์จำนวนมากที่สุด หากไม่ระบุ PATTERN ให้แบ่งช่องว่าง ต่อไปนี้เป็นตัวอย่าง -

#!/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

สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -

Roses
Michael

แปลงอาร์เรย์เป็นสตริง

เราสามารถใช้ไฟล์ join()ฟังก์ชันเพื่อเข้าร่วมองค์ประกอบอาร์เรย์อีกครั้งและสร้างสตริงสเกลาร์ยาวหนึ่งชุด ฟังก์ชันนี้มีไวยากรณ์ต่อไปนี้ -

join EXPR, LIST

ฟังก์ชันนี้รวมสตริงที่แยกจาก LIST เป็นสตริงเดียวโดยมีฟิลด์คั่นด้วยค่า EXPR และส่งกลับสตริง ต่อไปนี้เป็นตัวอย่าง -

#!/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";

สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -

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

การเรียงลำดับอาร์เรย์

sort()ฟังก์ชันจัดเรียงองค์ประกอบของอาร์เรย์แต่ละรายการตามมาตรฐาน ASCII Numeric ฟังก์ชันนี้มีไวยากรณ์ต่อไปนี้ -

sort [ SUBROUTINE ] LIST

ฟังก์ชันนี้จะจัดเรียงรายการและส่งกลับค่าอาร์เรย์ที่เรียงลำดับ หากระบุ SUBROUTINE ตรรกะที่ระบุภายใน SUBTROUTINE จะถูกนำไปใช้ในขณะที่เรียงลำดับองค์ประกอบ

#!/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";

สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -

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

โปรดทราบว่าการเรียงลำดับจะดำเนินการตามค่า ASCII Numeric ของคำ ดังนั้นตัวเลือกที่ดีที่สุดคือการแปลงทุกองค์ประกอบของอาร์เรย์เป็นอักษรตัวพิมพ์เล็กก่อนจากนั้นจึงใช้ฟังก์ชันเรียงลำดับ

$ [ตัวแปรพิเศษ

จนถึงตอนนี้คุณได้เห็นตัวแปรง่ายๆที่เรากำหนดไว้ในโปรแกรมของเราและใช้เพื่อจัดเก็บและพิมพ์ค่าสเกลาร์และอาร์เรย์ Perl มีตัวแปรพิเศษมากมายซึ่งมีความหมายที่กำหนดไว้ล่วงหน้า

เรามีตัวแปรพิเศษซึ่งเขียนเป็น $[. ตัวแปรพิเศษนี้เป็นสเกลาร์ที่มีดัชนีแรกของอาร์เรย์ทั้งหมด เนื่องจากอาร์เรย์ Perl มีการจัดทำดัชนีที่อิงเป็นศูนย์ $ [จะเป็น 0 เกือบตลอดเวลา แต่ถ้าคุณตั้งค่า $ [เป็น 1 อาร์เรย์ทั้งหมดของคุณจะใช้การจัดทำดัชนีบนพื้นฐาน ขอแนะนำว่าอย่าใช้การจัดทำดัชนีอื่นใดนอกจากศูนย์ อย่างไรก็ตามเรามาดูตัวอย่างการใช้ $ [ตัวแปร -

#!/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";

สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -

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

การรวมอาร์เรย์

เนื่องจากอาร์เรย์เป็นเพียงลำดับค่าที่คั่นด้วยเครื่องหมายจุลภาคคุณสามารถรวมเข้าด้วยกันได้ดังที่แสดงด้านล่าง -

#!/usr/bin/perl

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

print "numbers = @numbers\n";

สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -

numbers = 1 3 4 5 6

อาร์เรย์แบบฝังจะกลายเป็นส่วนหนึ่งของอาร์เรย์หลักดังที่แสดงด้านล่าง -

#!/usr/bin/perl

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

@numbers = (@odd, @even);

print "numbers = @numbers\n";

สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -

numbers = 1 3 5 2 4 6

การเลือกองค์ประกอบจากรายการ

สัญกรณ์รายการเหมือนกันสำหรับอาร์เรย์ คุณสามารถแยกองค์ประกอบออกจากอาร์เรย์ได้โดยการต่อท้ายวงเล็บเหลี่ยมเข้ากับรายการและให้หนึ่งดัชนีขึ้นไป -

#!/usr/bin/perl

$var = (5,4,3,2,1)[4];

print "value of var = $var\n"

สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -

value of var = 1

ในทำนองเดียวกันเราสามารถแยกชิ้นได้แม้ว่าจะไม่มีข้อกำหนดสำหรับอักขระ @ นำหน้า -

#!/usr/bin/perl

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

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

สิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -

Value of list = 4 3 2