Associative Array ก็คือ map หรือ list ของ key-value
✅ วิธีที่ 1: ส่งเป็น Reference (วิธีแนะนำ)
⚠️ วิธีที่ 2: ส่งเข้าไปตรงๆ (มีข้อควรระวัง)
✅ วิธีที่ 1: ส่งเป็น Reference (วิธีแนะนำ)
นี่เป็นวิธีที่ แนะนำและใช้กันบ่อยที่สุด เพราะปลอดภัยและมีประสิทธิภาพสูงสุด โดยเฉพาะเมื่อ hash มีขนาดใหญ่
หลักการ: เราจะส่ง “ที่อยู่” หรือ “ตัวชี้” ของ hash เข้าไปในฟังก์ชันแทนที่จะคัดลอกข้อมูลทั้งหมด
วิธีการทำ:
- ตอนเรียกใช้ฟังก์ชัน: ใส่เครื่องหมาย backslash (
\) หน้าชื่อ hash เพื่อสร้าง reference. - ในฟังก์ชัน: รับค่า reference เข้ามาในตัวแปร scalar (เช่น
$vars_ref) แล้วใช้%{ ... }หรือ->เพื่อเข้าถึงข้อมูลข้างใน
use strict;
use warnings;
use Data::Dumper;
# ฟังก์ชันที่รับ reference ของ hash
sub print_data {
# 1. รับ reference เข้ามาในตัวแปร scalar
my ($data_ref) = @_;
# 2. เข้าถึงข้อมูลผ่าน reference
print "Name: " . $data_ref->{'name'} . "\n";
print "Position: " . $data_ref->{'position'} . "\n";
# หรือจะ dereference เพื่อสร้าง hash copy ขึ้นมาใช้ใน function ก็ได้
# my %local_data = %{$data_ref};
# print "ID: " . $local_data{'id'} . "\n";
}
# สร้าง hash
my %vars = (
name => "John Doe",
id => 123,
position => "Developer"
);
# 3. ส่ง reference ของ hash เข้าไปในฟังก์ชัน
print_data(\%vars);
ทำไมวิธีนี้ถึงดีที่สุด? 👍
- ประสิทธิภาพ: ไม่มีการคัดลอกข้อมูลทั้งหมด ทำให้โปรแกรมทำงานเร็วขึ้น โดยเฉพาะกับ hash ใหญ่ๆ
- ความชัดเจน: เมื่อส่งตัวแปรหลายตัวเข้าไปในฟังก์ชัน จะไม่เกิดปัญหาสับสน เพราะ Perl จะเห็น reference เป็นแค่ scalar 1 ตัว
- แก้ไขข้อมูลต้นฉบับได้: ฟังก์ชันสามารถแก้ไขข้อมูลใน hash ต้นฉบับได้โดยตรงผ่าน reference
⚠️ วิธีที่ 2: ส่งเข้าไปตรงๆ (มีข้อควรระวัง)
วิธีนี้คือการส่ง hash เข้าไปตรงๆ เลย ซึ่ง Perl จะแปลง hash ให้กลายเป็น “list” ของ key-value สลับกันไป
หลักการ: Perl จะนำ key และ value ทั้งหมดมาเรียงต่อกันเป็น list แล้วส่งเข้าไปใน array พิเศษชื่อ @_ ของฟังก์ชัน
use strict;
use warnings;
sub print_data_direct {
# รับ list จาก @_ แล้วสร้างเป็น hash ใหม่
my %data = @_;
print "Name: " . $data{'name'} . "\n";
print "Position: " . $data{'position'} . "\n";
}
# สร้าง hash
my %vars = (
name => "Jane Smith",
id => 456,
position => "Manager"
);
# ส่ง hash เข้าไปตรงๆ
print_data_direct(%vars);
ข้อควรระวังอย่างยิ่ง! 🚨 วิธีนี้จะใช้ได้ดีก็ต่อเมื่อ hash เป็น argument ตัวสุดท้ายที่ส่งเข้าฟังก์ชันเท่านั้น เพราะมันจะ “ดูด” (slurp) argument ที่เหลือทั้งหมดใน @_ ไปสร้างเป็น hash

