PERL – ส่ง Associative Array เข้าไปใน function

PERL – ส่ง Associative Array เข้าไปใน function

Associative Array ก็คือ map หรือ list ของ key-value

✅ วิธีที่ 1: ส่งเป็น Reference (วิธีแนะนำ)
⚠️ วิธีที่ 2: ส่งเข้าไปตรงๆ (มีข้อควรระวัง)

✅ วิธีที่ 1: ส่งเป็น Reference (วิธีแนะนำ)

นี่เป็นวิธีที่ แนะนำและใช้กันบ่อยที่สุด เพราะปลอดภัยและมีประสิทธิภาพสูงสุด โดยเฉพาะเมื่อ hash มีขนาดใหญ่

หลักการ: เราจะส่ง “ที่อยู่” หรือ “ตัวชี้” ของ hash เข้าไปในฟังก์ชันแทนที่จะคัดลอกข้อมูลทั้งหมด

วิธีการทำ:

  1. ตอนเรียกใช้ฟังก์ชัน: ใส่เครื่องหมาย backslash (\) หน้าชื่อ hash เพื่อสร้าง reference.
  2. ในฟังก์ชัน: รับค่า 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