เขียนโปรแกรมคอมพิวเตอร์ด้วยภาษา perl

การเขียนโปรแกรมในคอมพิวเตอร์ มีให้เลือกหลายภาษา หลักสำคัญที่สุด ในการเลือกเขียนภาษาที่ใช้เขียนโปรแกรม คือ คำสั่งต่างๆที่เคยมีมาในอดีต จะต้องไม่ถูกตัดทิ้ง มิฉะนั้น เมื่อเวลาผ่านไป ต้องลงระบบปฎิบัติการใหม่ ต้องเปลี่ยนรุ่นของตัวแปลภาษา (เช่น เปลี่ยนจาก php4 เป็น php5) จะทำให้โปรแกรมที่เราเคยเขียนมาในอดีต พังทันที ภาษาที่ชอบตัดคำสั่งในอดีตทิ้ง เช่น php, ruby, python ภาษาเหล่านี้จึงไม่ควรใช้เลย

ภาษาที่ใช้เขียนโปรแกรม ไม่ว่าจะเป็น java, perl, php, ruby, c#, python ล้วนแต่เขียนด้วยภาษา c (หรือ c++) การเขียนภาษา c เป็นงานยากและเสียเวลา เช่น มีเรื่องขนาดของหน่วยความจำมาเกี่ยวข้องกับขนาดและชนิดของข้อมูล และมีบางเรื่องสับสนซ่อนเงื่อนไว้ จึงมีคนเอาภาษา c มาเขียนเป็นภาษาใหม่ เพื่อให้ใช้ง่ายขึ้น เขียนได้เร็วขึ้น เรียกว่าเป็นภาษาขั้นสูงขึ้น เวลาเขียนโปรแกรมด้วยภาษาขั้นสูง จะนิยมเรียกกันว่า เขียนสคริป (script) เพื่อแยกออกจากภาษาที่ต้อง compile ที่ใช้งานได้แม้จะไม่มีตัวแปลภาษาอยู่บนเครื่อง อย่างเช่นภาษา c จึงเรียกว่าเขียนโปรแกรม แต่ข้อเสียของภาษาขั้นสูงคือ เวลาใช้งานจะใช้ทรัพยากรมากขึ้น พวกมันจึงเหมาะสำหรับ การเขียนที่ต้องการความรวดเร็ว หรือ การใช้งานจริงที่มีทรัพยากรเหลือเฟือ แต่ถ้างานหนักจริงๆ เขียนด้วยภาษา c จะใช้ทรัพยากรน้อยที่สุด เช่น สคริปที่เขียนด้วย perl อาจใช้คอมพิวเตอร์ 10 เครื่อง แต่ถ้าเขียนโปรแกรมด้วย c จะใช้คอมพิวเตอร์เพียงแค่ 1 เครื่อง เพื่อประมวลผลให้เสร็จในเวลาเท่ากัน

perl สามารถจะทำงานได้หลากหลาย มากกว่าภาษาขั้นสูงอื่นๆอย่าง python, ruby หรือ java ซึ่งมีข้อจำกัดมากกว่า แถม perl ยังใกล้เคียงกับภาษาอื่นอย่างเช่น c หรือ php ผู้เขียนภาษา c หรือ perl จึงสามารถสลับไปมาได้ง่าย ต่างจาก java ที่มีศัพท์เฉพาะตัว การเขียน java จึงต้องเริ่มเรียนรู้จากศูนย์ เมื่อเรียนรู้แล้ว จะนำไปต่อยอดเขียนภาษาอื่นไม่ได้ แถม java ยังต้องเขียนยืดยาวซับซ้อน เวลาทำงานก็ใช้ทรัพยากรมาก การเรียนเขียน java จึงเป็นความผิดพลาดอย่างมาก

ผู้เขียนชอบ perl มากที่สุดตรง นโยบายหลักของ perl ที่บอกว่า จะต้องคงคำสั่งเดิมไว้ ถึงแม้ว่ามันจะเป็นคำสั่งที่ผิด แต่ผู้สร้างจะไม่ตัดสินแทนผู้ใช้ สคริปที่ใช้ได้ใน perl1 จะยังคงใช้ได้ใน perl5 นอกจากนี้ perl ยังมีข้อดีอื่นๆอีก เช่น เป็นภาษาที่มีประวัติมายาวนาน จนตกผลึกแล้ว ทำให้ภาษามีระเบียบเรียบร้อย ทำงานอย่างเที่ยงตรง (nifty) เขียนแล้วมีความสุข มีความยืดหยุ่น ใช้แล้วไม่มีข้อจำกัด ดูเหมือนว่ากลุ่มผู้สร้าง perl จะพยายามทำให้คำสั่งต่างๆเขียนสั้นกะทัดรัดมากที่สุด ซึ่งโดนใจคนที่เคยเขียนสคริปเยอะๆมาจนพบว่า ยิ่งเขียนเยอะ ยิ่งอ่านแล้วตาลาย ผู้สร้าง perl บอกว่า perl มีมากกว่า 1 ทางเลือกเสมอ แต่ผู้เขียนอยากจะบอกว่า perl มีทางเลือกที่ดีกว่าเสมอ ด้วยการทำให้ภาษาคอมพิวเตอร์ ใกล้เคียงกับภาษาคนมากที่สุด เช่น ตัดวงเล็บ () และ {} ออกไปได้ ด้วยเหตุผลเหล่านี้ ถ้าใครที่คิดจะเรียนเขียนโปรแกรมสักภาษาหนึ่ง แล้วอยู่กับมันไปตลอดชีวิต ผู้เขียนแนะนำให้ใช้ perl เพราะเขียนทีเดียวจบ ไม่ต้องปรับตัวบ่อยๆเหมือนภาษาอื่น สคริปที่สามารถเขียนได้สั้นกะทัดรัดและเที่ยงตรง เป็นความสุขอย่างหนึ่ง ต่างจากภาษาอื่นที่ยิ่งเขียนยิ่งงง แต่ยังต้องเขียนต่อไปด้วยความจำเป็นบังคับ ทำให้เบื่อหน่ายได้ง่าย ทุกคนชอบอยู่กับสิ่งที่ทำให้ตนเองมีความสุข โปรแกรมที่เขียนแล้วมีความสุข จะทำให้เราชอบใช้เวลาอยู่กับมันมากขึ้น แม้แต่ทำเป็นงานอดิเรก การใช้เวลาอยู่กับมันมากขึ้น จะช่วยให้เราเขียนโปรแกรมได้มากขึ้น

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

ความแตกต่างระหว่าง perl กับ php

ผู้เขียนเริ่มเขียนภาษา perl มาตั้งแต่ก่อนปี ค.ศ.2000 เนื่องจากสมัยก่อนยังไม่มี php ต่อมาหลังปี ค.ศ.2003 php3 เริ่มดังขึ้น จึงเปลี่ยนมาเขียน php สาเหตุที่ทำให้ php โด่งดังขึ้น และ perl ถูกลืมไป คือ
ปัจจุบันในเมืองไทย มีผู้ให้บริการพื้นที่เวปไซต์รายเดียวคือ www.brinkstudio.com ที่สามารถเขียน perl ปะปนอยู่ในหน้า html และดู error จากหน้าเวปได้เหมือน php

ปัญหาใหญ่ที่สุด ที่พบจากการเขียน php คือ คนสร้างภาษา php เป็นกลุ่มคนที่อ่อนประสบการณ์ จึงชอบเปลี่ยนแปลงโดยไม่คำนึงถึงผู้ใช้ในอดีต ตัวอย่างที่เห็นได้ชัดคือ php มักจะมีหลายรุ่นมาก เช่น 4.9, 5.2, 5.3, 5.4, 5.5, 5.6,7.0,... สคริปที่เขียนบน 4.9 จะนำมาใช้บน 5.2-5.6 ไม่ได้ เพราะหลายคำสั่งถูกตัดทิ้งไป ปัญหาจะเกิดขึ้น เมื่อในอดีต เราเคยเขียนสคริปบน 4.9 แต่เมื่อเวลาผ่านไปหลายๆปี จำเป็นต้องย้ายเครื่อง ซึ่งลงระบบปฎิบัติการรุ่นใหม่ ซึ่งไม่รองรับ php 4.9 แล้ว ต้องเปลี่ยนมาลง php 5.2 แต่สคริปที่เราเคยเขียนมา ไม่ทำงานบน 5.2 ทำให้ต้องเสียเวลามาแก้สคริปใหม่ บางสคริปเขียนกันเป็นปีๆ จะแก้ทีไม่ใช่เรื่องง่าย บางสคริปไปจ้างคนอื่นเขียน พอเวลาผ่านไป หาคนเขียนไม่เจอแล้ว ผ่านไปอีกสักพักมี 5.3 เกิดขึ้น สคริปที่เคยเขียนสำหรับ 5.2 ก็นำมาใช้กับ 5.3 ไม่ได้อีก เป็นปัญหาเช่นนี้ไปเรื่อยๆ ท่านใดที่สงสัยในเรื่องนี้ สามารถเข้าไปดูได้ในคู่มือของ php แต่ละรุ่น ในหัวข้อ Deprecated features จะเห็นคำสั่งต่างๆที่ถูกยกเลิกไป

ตัวอย่างของความยุ่งยากของการเขียนภาษา php เช่น ถ้าเรามี array ที่มีค่าดังต่อไปนี้ ("baht\n", "dollar\n") แล้วเราต้องการลบ \n ออกจากทุกค่าใน array
perl php
@array=("baht\n", "dollar\n");

chomp for @array;
$array=array("baht\n", "dollar\n");

$new=array();
foreach ($array as $val) {
    $new[]=rtrim($val);
}
$array=$new;

จะเห็นว่า php ต้องเขียนถึง 11 คำ 4 บรรทัด (ซึ่งรกตามาก) ในขณะที่ perl เขียนสั้นๆแค่ 3 คำ ในบรรทัดเดียว พอเขียนเยอะขึ้น php จะยิ่งยาว ยิ่งอ่านยาก ยิ่งมีเครื่องหมายปิดเปิดอย่าง () และ {} เข้ามาเพิ่ม เวลาอ่านจะตาลาย อ่านยากขึ้นไปอีก ทำให้ต้องเสียเวลาอ่านและเขียนนานขึ้น

php พยายามสร้างคำสั่งใหม่ขึ้นมาเรื่อยๆ ทำให้เวลาเขียนสคริปด้วย php ต้องเปิดคู่มืออยู่ตลอดเวลา ถ้าเป็นคำสั่งที่ไม่ได้ใช้บ่อย จะต้องเสียเวลาหา เช่น ถ้าต้องการแสดงผลเครื่องหมาย = ติดกัน 10 ครั้ง php จะใช้คำสั่งใหม่ว่า echo str_repeat("=", 10); ในขณะที่ perl จะใช้คำสั่งเดิมที่จำง่ายๆว่า print '=' x 10;

ข้อเสียอีกอย่างของ php คือ ขาดความยืดหยุ่น เช่น โมดูลต่างๆ ต้องติดตั้งที่ส่วนกลาง อย่าง mysql module ถ้าผู้ดูแลเครื่องแม่ข่ายไม่ติดตั้งไว้ คนทำเวปด้วย php ก็จะติดต่อกับ mysql ไม่ได้ ต่างจาก perl ที่ยังสามารถไปดาวโหลดโมดูล มาติดตั้งไว้บนพื้นที่ของตัวเองได้

คู่มือ

perl เป็นตัวแปลภาษาที่ใส่คำสั่งพื้นฐานที่คนใช้บ่อยไว้ เช่น if, for ฯลฯ คู่มือคำสั่งพื้นฐานของ perl สามารถดาวโหลดได้ที่ http://perldoc.perl.org/ ซึ่งได้รวมคู่มือของโมดูลที่ใช้บ่อยไว้ด้วย แต่ถ้าต้องการรายละเอียดมากขึ้น แนะนำหนังสือชื่อ Programming Perl ซึ่งเขียนโดย Larry Wall ผู้สร้าง perl โดยตรง หน้าปกหนังสือเป็นรูปอูฐ คนจึงนิยมเรียกกันสั้นๆว่า the camel book โดยผู้สร้างให้เหตุผลว่า สาเหตุหนึ่งที่เลือกอูฐ เพราะมันเป็นสัตว์ที่อยู่อย่างพอเพียง ไม่ได้ต้องการความหรูหรา หนังสือเล่มนี้เกิดขึ้นได้เพราะสำนักพิมพ์ O'Reilly จ้าง Larry Wall ให้พัฒนา perl ต่อไปและเขียนหนังสือเล่มนี้ด้วย การซื้อหนังสือจึงเท่ากับอุดหนุนผู้ที่ช่วยให้ perl เติบโตมาจนถึงทุกวันนี้ แต่ถ้าไม่มีเงิน จะหาดาวโหลด pdf จากในอินเตอร์เน็ตก็ได้

สำหรับโมดูลประหลาดๆอื่นๆ ที่ไม่ค่อยมีใครใช้ สามารถดูคู่มือของแต่ละโมดูลได้ที่ www.cpan.org

นอกจากนี้ยังมีเทคนิคต่างๆ ที่หาได้ตามอินเตอร์เน็ต ซึ่งค่อนข้างกระจัดกระจาย คนที่ต้องการเขียน perl จึงควรทำบันทึกส่วนตัวไว้ ว่าเคยเขียนคำสั่งอะไรไปแล้วบ้าง วันหลังกลับมาเขียนใหม่ จะได้ไม่ต้องเสียเวลาค้นหา

เครื่องมือ

การเขียน perl ใช้โปรแกรม text editor อย่างเช่น notepad++ จะดีที่สุด เพราะ มีตัวช่วย ทั้งสีของคำสั่งที่แตกต่างกัน ช่วยให้มองง่ายขึ้น

ปกติระบบปฎิบัติการบน unix จะติดตั้ง perl ไว้อยู่แล้ว เพราะมีหลายโปรแกรมต้องใช้ perl เช่น apache ซึ่งทำงานเป็น web server แต่บนไมโครซอฟวินโดวส์ จะไม่มี perl ติดมา ต้องติดตั้งใหม่ อาจจะใช้ activeperl หรือ cygwin (ซึ่งเป็น linux) หรือ virtualbox ที่ลงระบบปฎิบัติการ unix หรือจะลงเครื่องใหม่แยกออกมาเลยก็ได้

เริ่มเขียน

การเขียน perl จะนิยมตั้งชื่อไฟล์นามสกุล .pl ถึงแม้ว่าจะทำงานบน unix ก็ควรจะใช้เช่นนี้ เพื่อแยกมันออกจากโปรแกรมตัวอื่นที่ไม่มีนามสกุล เพราะเขียนด้วยภาษา c

เปิดโปรแกรม  text editor เขียนข้อความดังต่อไปนี้ สังเกตุว่า คำสั่งใน perl ต้องมี ; ด้านท้ายเพื่อจบคำสั่ง ถ้าไม่มีแสดงว่ายังไม่จบคำสั่ง สามารถเว้นบรรทัดเพื่อเขียนต่อในบรรทัดถัดไปได้
print 'hello';


เสร็จแล้ว save ลงในชื่อ test.pl ข้อควรระวัง ในการเขียน perl ให้ทำงานบน unix จะต้องใช้ตัวเว้นบรรทัด (EOL ซึ่งย่อมาจาก End Of Line) เป็น \n ถ้าเริ่มเขียนจากบนไมโครซอฟวินโดวส์ ตัวเว้นบรรทัดจะเป็น \r\n ซึ่งถ้านำมาทำงานบน unix จะเกิด error ขึ้น กรณีนี้ต้องใช้โปรแกรม text editor แปลงจาก windows \r\n เป็น unix \n ก่อน (ในโปรแกรม notepad++ ให้ดูที่ Edit > EOL conversion) หมายเหตุว่า ตัวเว้นบรรทัดจะไม่แสดงให้เห็นในโปรแกรม text editor

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

perl test.pl

หากขึ้นข้อความ Can't find string terminator ... anywhere before EOF at ... แสดงว่า บรรทัดสุดท้าย ยังไม่ได้ขึ้นบรรทัดใหม่

เวลาใช้งานแบบอัตโนมัติ เช่น เรียกผ่านเวป หรือ โปรแกรมอื่นๆ จะไม่พิมพ์ perl นำหน้า แต่จะเรียกตรงๆจากชื่อไฟล์ จึงต้องใส่ที่อยู่ของ perl ไว้ด้านบนของไฟล์ (เช่น #/usr/bin/perl บน linux หรือ #/usr/local/bin/perl บน unix หรือจะใช้ #perl เฉยๆก็ได้ เพราะปกติตำแหน่งของ perl จะเป็นที่รู้จักอยู่แล้ว แต่ใส่ตำแหน่งให้ครบจะดีที่สุด เพื่อที่เวลาเรียกจะไม่ต้องเสียเวลาหา)
#/usr/bin/perl 
print 'hello';




เสร็จแล้วต้องทำให้ test.pl สามารถ execute ตัวเองได้ (ใช้คำสั่ง chmod บน unix เช่น chmod a+x ซึ่งคำสั่งนี้มีอยู่ในโปรแกรม ftp ด้วย) เสร็จแล้วจะสามารถเรียกตรงๆได้จาก ./

./test.pl

แต่เวลาทดสอบสคริป จะยังคงเรียกแบบเดิมก็ได้ คือขึ้นต้นด้วย perl ซึ่งผู้เขียนนิยมพิมพ์ perl มากกว่า เพื่อจะได้ไม่ต้องสนใจ chmod

การทดสอบคำสั่งสั้นๆ เราไม่จำเป็นต้องเขียนลงไฟล์ แต่สามารถเข้า command line แล้วพิมพ์โดยตรงเช่น

perl -e "print 'hello';"

สังเกตุว่า มีเครื่องหมายคำพูดคู่ " และเดี่ยว ' อยู่ร่วมกัน เพราะ ใช้เครื่องหมายคำพูดเหมือนกันซ้อนกันไม่ได้ จะกลายเป็นจบเครื่องหมายคำพูดนั้น

ผู้เขียนได้รวบรวมคำสั่งที่ใช้บ่อย รวมทั้งเคล็ดลับและข้อควรระวัง ทั้งจากในอินเตอร์เน็ตและจากประสบการณ์ ดังต่อไปนี้ แต่จะขออธิบายเฉพาะหัวใจสำคัญ เพื่อให้ผู้อ่านมือใหม่ใช้เป็น เพราะถ้าเขียนหมดจะยาวมาก รายละเอียดเพิ่มเติม สามารถดูได้จากในคู่มือ perl

แสดงผล

print คือคำสั่งหลัก และคำสั่งเดียว ที่ใช้แสดงผลกลับมาให้ผู้ใช้เห็น การ print ตัวหนังสือ จำเป็นต้องใส่เครื่องหมายคำพูดด้วย จะเป็นคำพูดเดี่ยว ' หรือคู่ " ก็ได้ คำพูดเดี่ยว ' พิมพ์ง่ายกว่า

print เหมาะจะใช้แสดงผลทีละบรรทัด การแสดงผลทีละหลายบรรทัด จะใช้วิธีเว้นบรรทัด โดยยังไม่ต้องปิดเครื่องหมายคำพูด
  print 'hello
world';




อีกวิธีหนึ่งคือใช้ \n แต่ใช้ได้กับเครื่องหมายคำพูดคู่ " เท่านั้น ใช้ไม่ได้ในเครื่องหมายคำพูดเดี่ยว ' นอกจาก \n แล้ว ยังสามารถใช้เครื่องหมายอื่นๆ เช่น \t แทน ปุ่ม tab
  print "hello\nworld";



การเว้นบรรทัดหลายๆบรรทัด อย่างเช่น การส่งอีเมล หากเขียนเหมือนข้างต้น จะดูยาก การเขียนให้ดูง่ายขึ้น จะใช้ << ตามด้วยคำว่าอะไรก็ได้ ไม่จำเป็นต้องเป็น EOF แต่ควรเป็นตัวใหญ่ เพื่อแยกออกจากภาษาคน แต่ตอนปิดคำพูดต้องใช้คำเดียวกัน เรียกการเขียนแบบนี้ว่า Here Documents สังเกตุว่ามีเครื่องหมายคำพูดคู่คลุม EOF ซึ่งหมายถึง ข้อความต่อจากนั้น จะเหมือนคลุมด้วยเครื่องหมายคำพูดคู่ " จะใช้เครื่องหมายคำพูดเดี่ยว ' ก็ต่อเมื่อมีตัวแปรอยู่ข้างใน และไม่ต้องการให้ตัวแปรนั้นถูกแปลค่า (อ่านในเรื่อง ตัวแปร) ถ้าไม่มีเครื่องหมายคำพูดคลุม จะถูกตีความว่าเป็นเครื่องหมายคำพูดคู่ โดยอัตโนมัติ
  print <<"EOF";
hello
world
EOF

#หรือเขียนให้สั้นลงโดยตัด EOF ออก แต่จะใช้ได้เฉพาะเมื่อไม่มีช่องว่างระหว่างบรรทัด
print <<""
hello
world








Comment

comment คือ บรรทัดที่ไม่ถูกนำมาประมวลผล อาจเขียนเป็นหมายเหตุเพื่อให้รู้ที่มาที่ไป การเขียนชื่อตัวเองลงไปในสคริป จะช่วยให้ผู้อื่นเห็นผลงาน และสนใจว่าจ้างเราในอนาคต การ comment ไม่จำเป็นต้องขึ้นบรรทัดใหม่เสมอไป สามารถเขียนต่อท้ายคำสั่งได้ด้วย
  # written by me
print 'hello'; # หรือเขียนต่อท้ายได้




การ comment  หรือ uncomment (ยกเลิก comment) หลายๆบรรทัด ถ้าเปลี่ยนทีละบรรทัดจะเสียเวลามาก โปรแกรม notepad++ สามารถเปลี่ยนทีละหลายๆบรรทัดได้ง่ายๆในครั้งเดียว โดยใช้ mouse ลากคลุมบรรทัดที่ไม่ต้องการให้แสดงผล แล้วคลิกขวาเลือก Toggle single line comment ซึ่งทำได้ทั้ง comment และ uncomment

สำหรับคนที่ไม่ได้ใช้ notepad++ แต่ใช้โปรแกรม text editor ตัวอื่นไม่มีตัวเลือกให้ comment และ uncomment ถ้าไม่อยากพิมพ์และลบ # หลายๆบรรทัดจะใช้ comment ในอีกรูปแบบหนึ่งคือ
  =pod
...
=cut




ตัวแปร (scalar, array, hash)

การนำค่าหนึ่งมาประมวลผลเพียงครั้งเดียว (เช่น print คำว่า hello เพียงครั้งเดียว) ใช้วิธีเขียนค่านั้นลงไปเลย จะเร็วกว่า เรียกว่า hard code แต่ถ้าต้องใช้ค่านั้นหลายๆครั้งในสคริป (เช่น print คำว่า hello หลายๆครั้ง) ควรจะกำหนดตัวแปรแทนค่านั้น แล้วนำตัวแปรไปใช้ เพื่อเวลาเปลี่ยนค่าจะง่ายกว่าการไล่เปลี่ยนหลายๆตัว เพราะเปลี่ยนแค่บรรทัดเดียวที่กำหนดค่านั้น

ตัวแปรที่นำไปใช้ (เช่น นำไป print) ไม่ต้องใส่เครื่องหมายคำพูดคลุม ยกเว้นจะอยู่ร่วมกับตัวอักษรอื่น ซึ่งตัวแปรจะถูกแปลผลเฉพาะเมื่ออยู่ในเครื่องหมายคำพูดคู่ " ตัวแปรที่อยู่ในเครื่องหมายคำพูดเดี่ยว ' จะไม่ถูกแปล แต่จะถูกมองเหมือนเป็นตัวอักษร
$var='hello';
print "$var" ; # แสดงผลเป็น hello
print '$var' ; # แสดงผลเป็น $var





ถ้าต้องการให้ตัวแปรในเครื่องหมายคำพูดเดี่ยว ' สามารถแปลผลได้ ต้องใส่ qq เข้าไปข้างหน้า เพื่อแปลงคำพูดเดี่ยว ' ให้เป็นคำพูดคู่ " ถ้าไม่มีเครื่องหมายคำพูดแต่มีวงเล็บเปิดปิดแทน ก็ใช้ได้เช่นกัน ในทางกลับกัน ถ้าจะแปลงเครื่องหมายคำพูดคู่ " ให้เป็นเครื่องหมายคำพูดเดี่ยว ' จะใช้ q ตัวเดียว

scalar คือตัวแปรค่าเดียว บน perl จะขึ้นต้นด้วย $ ส่วนค่าตัวแปรที่ไม่ใช่ตัวเลข ควรใส่เครื่องหมายคำพูดคลุมเสมอ เช่น $var='hello';

เวลานำตัวแปรไปใช้ ถ้ามีอักษรอื่นปน จะใส่เครื่องหมายคำพูดคลุมหมด หรือจะใส่เฉพาะที่ตัวหนังสืออื่นก็ได้
$var='hello';
print "$var world";
# หรือ
print $var, ' world';
# หรือ
print $var . ' world';
# หรือ
print qq '$var world';
# หรือ
print qq ($var world);












array สามารถเก็บหลายค่าไว้ในตัวแปรเดียว โดยใช้ตัวแปรที่ขึ้นต้นด้วย @ แต่เวลาเรียกสมาชิกภายใน จะใช้ $ นำหน้า และปิดท้ายด้วย [key] เช่น $arr[0] ซึ่ง key จะใช้ตัวเลขเรียงลำดับตามตำแหน่งของสมาชิกใน array เป็น 0,1,2,...

สมาชิกใน array (เรียกว่า value) ควรใส่เครื่องหมายคำพูดคลุมเสมอ ยกเว้นตัวเลข ถ้าขี้เกียจพิมพ์เครื่องหมายคำพูดและคอมม่า (,) จะใช้ qw ช่วยก็ได้ ซึ่ง qw ย่อมาจาก quote words แต่จะใช้ได้เฉพาะกรณีที่สมาชิกทุกตัว ไม่มีช่องว่างอยู่ภายใน
@arr=( 'thai', 'us' );

# หรือเขียนให้ง่ายขึ้นด้วย qw
@arr= qw ( thai us );

# การกำหนดค่าทีละตัว
$arr[0]='thai';
$arr[1]='us';

# แสดงผล
print @arr;
# หรือแสดงผลแบบมีช่องว่างระหว่างสมาชิก เพื่อให้อ่านง่ายขึ้น
print "@arr";















hash จะขึ้นต้นด้วย % ใช้เก็บค่าเหมือน array แต่ key ไม่ใช่ตัวเลขเรียงลำดับ จะใช้คำว่าอะไรก็ได้ key ไม่จำเป็นต้องมีเครื่องหมายคำพูด ยกเว้นจะมีจุดอยู่ภายใน ส่วนค่าของ hash เรียกว่า value ถ้าไม่ใช่ตัวเลข  จำเป็นต้องมีเครื่องหมายคำพูด แต่เพื่อให้จำง่าย ควรใส่เครื่องหมายคำพูดคลุมทุกตัว
%h=( thai =>'baht', us =>'dollar');

# หรือเขียนให้อ่านง่ายขึ้นเป็น
%h=(
    thai=>'baht',
    us=>'dollar'
);
# หรือ
%h = ( 'thai', 'baht', 'us', 'dollar' ); # ควรใส่เครื่องหมายคำพูดทุกตัว

# หรือกำหนดค่าทีละตัว
$h{thai}='baht';
$h{us}='dollar';

# แต่เวลา print ต้องเขียนซับซ้อนขึ้น
print "@{[%h]}";
# หรือแสดงผลให้อ่านง่ายขึ้น
print "$key=$val\n" while ($key, $val) = each %h;

















เงื่อนไข (if, loop)

if เป็นคำสั่งที่ตาลายที่สุด โดยเฉพาะเวลาซ้อนกันหลายๆชั้น เพราะมีทั้ง {} และ () วิธีแก้ไขเบื้องต้นคือ ใช้ tab เพื่อย่อหน้าให้ข้อความที่อยู่ในวงเล็บปีกกา {} เว้นห่างออกมาจากขอบซ้ายเมื่อเทียบกับ if เท่ากับ 1 ย่อหน้า ด้วยการกด tab 1 ครั้ง แต่ถ้ามีหลายๆบรรทัด การกด tab ทีละบรรทัดจะเสียเวลามาก โปรแกรม text editor ทั่วไปสามารถย่อหน้าพร้อมกันครั้งละหลายๆบรรทัดได้ โดยลากเมาส์คลุมบรรทัดที่ต้องการ แล้วกดปุ่ม tab ทีเดียว ทุกบรรทัดที่เลือกไว้จะเลื่อนตามมาหมด ถ้าจะเลื่อนย่อหน้ากลับไปก็ลากเมาส์คลุมใหม่แล้วใช้ shift+tab

perl สามารถเขียน if และ loop ให้สั้นลง และอ่านง่ายขึ้น ด้วยการตัด {} และ () ออก ช่วยให้อ่านง่ายขึ้น เหมือนอ่านภาษาคน มากกว่าภาษาโปรแกรม เรียกการเขียนแบบนี้ว่า shorthand
if ($var eq 'hello') { print 'yes' }

# เขียนให้สั้นลงได้เป็น
print 'yes' if $var eq 'hello';






เงื่อนไขถัดไปจะใช้ else
if ($var eq 'hello') {
    print 'yes'
} else {
    print 'no'
}

# หรือเขียนได้อีกแบบโดยใช้ or
print 'no' or print 'yes' if $var eq 'hello';

# หรือเขียนให้สั้นลงได้โดยใช้เครื่องหมาย ternary คือ ? และ :
$var eq 'hello' ? print 'yes' : print 'no';

# หรือย่อลงอีกเป็น
print $var eq 'hello' ? 'yes' : 'no';
















ถ้ามีหลายๆเงื่อนไข จะใช้ elsif
if ($var eq 'hello') {
    $result='yes'
} elsif ($var eq 'world') {
    $result='no'
} else {
    $result='sorry

print $result;

# เขียนให้สั้นลงได้เป็น
print $result = $var eq 'hello' ? 'yes' : $var eq 'world' ? 'no' : 'sorry';













if ซ้อน if ก็สามารถเขียนให้สั้นลงได้
if ($x eq 'hello') {
    if ($y eq 'world') {
        print 'yes'
    } else {
        print 'no'
    }
}

# เขียนให้สั้นลงได้เป็น
print $y eq 'world' ? 'yes' : 'no' if $x eq 'hello';












การตรวจสอบว่าตัวแปรมีค่าหรือไม่ จะใช้ if ($var)
if ( $str1 ) {
    $var = $str1;
} elsif ($str2)  {
    $var = $str2;
} else {
    $var = 'sorry';
}
print $var;

# เขียนให้สั้นลงได้เป็น
print $var = $str1 || $str2 || 'sorry';













ในทางตรงกันข้าม ถ้าต้องการตรวจสอบว่าตัวแปรไม่มีค่า จะใช้ if (!$var) หรือ if (not $var) หรือใช้ unless ($var) แทนจะอ่านง่ายกว่า
$var = 'sorry' unless $var;

# เขียนให้สั้นลงได้เป็น
$var ||= 'sorry';






เงื่อนไขบางตัว อาจมีหลายคำสั่ง จะใช้ do {...} ช่วย ซึ่งมีประโยชน์มาก เวลาอยู่ในกรอบของ if เพราะถ้ามี if ซ้อน if จะอ่านยาก หรือ ถ้าไม่อยากมีวงเล็บ จะไม่ใช้ do แต่ใช้ and แทนก็ได้
$var eq 'hello' ? print 'yes' : do { print 'no'; print ' sorry'} ;

# หรือใช้ and แทน
$var eq 'hello' ? print 'yes' : print 'no' and print ' sorry' ;






หลายเงื่อนไขอยู่ร่วมกัน ใช้ && แทน"และ" ใช้ || แทน"หรือ"
if (..&& ..&&..) ...
while (..|| ..||..)  ...




while จะใช้งานอยู่ก้ำกึ่งระหว่าง if กับ for ใช้ทำ loop ที่มีเงื่อนไขซับซ้อน
คำสั่ง last ใช้กับ while, if และ for เพื่อหยุดแล้วออกจาก loop
while (<>) {
   last if $_ eq "\n";
   print $_;
}






<> หมายถึง อ่านจากข้อมูลที่ป้อนเข้าไป โดยจะเริ่มประมวลผล หลังจากเจอเครื่องหมาย \n เพื่อเว้นบรรทัด
$_ คือค่าปัจจุบันของ loop ในที่นี้คือ บรรทัดที่อ่านได้จาก <>
last อาจะอยู่เดียวๆ หรืออาจจะมีเงื่อนไข ซึ่งเงื่อนไขที่ต่อจาก last ในที่นี้คือ ถ้าบรรทัดไหนที่ไม่พิมพ์อะไร (เท่ากับ \n) ให้หยุดแล้วออก

คำสั่ง next อยู่ในกลุ่มเดียวกับ last คือ บอกให้เลิกทำส่วนที่เหลือ แต่ยังไม่ต้องหยุด ให้เริ่มต้น loop ต่อไป เหมาะจะใช้เพื่อลดการสร้างวงเล็บปีกกา {} ขึ้นมาใหม่ ช่วยให้อ่านง่ายขึ้น เช่น ตัวอย่างการใช้ perl อ่านอีเมลชื่อ file.eml เพื่อแยกส่วนหัว ($header) ออกมา โดยเมื่อเจอบรรทัดที่เว้นว่างไว้ (unless /\S/ หรือ if /^\s*$/) จึงหยุดเก็บค่าส่วนหัว วิธีใช้สคริปตัวนี้ จะเรียกจาก unix command line ว่า cat file.eml | perl test.pl
while (<>) {
    # ทำบางอย่างตรงนี้จนจบทั้งฉบับ
    $end_header=1 unless /\S/;
    unless ($end_header) {
        $header.=$_;
        # ทำบางอย่างเกี่ยวกับ header
    }
}

# เขียนให้อ่านง่ายขึ้นด้วยการตัดวงเล็บปีกกา {} ภายในออก
while (<>) {
    # ทำบางอย่างตรงนี้จนจบทั้งฉบับ
    $end_header=1 if /^\s*$/;
    next if $end_header;
    $header.=$_;
    # ทำบางอย่างเกี่ยวกับ header
}



















for สามารถใช้ทำ loop แทน while ได้โดยไม่ต้องใช้ last มาหยุด
for ($i=0;$i<3;$i++) { print $i}



และสามารถเขียนให้สั้นลงได้เป็น
print $_ for 0,1,2;



for ปกติจะนิยมใช้กับ array หรือจะใช้ foreach แทน for ก็ได้ แต่ใช้ for จะสั้นกว่า
@arr=('thai', 'us');
print $_ for @arr;

# หรือเขียนใหม่ทั้งหมดเป็น
print $_ for 'thai', 'us';







รายละเอียดเพิ่มเติมของ if และ loop อ่านได้ในคู่มือ perl หัวข้อ perlsyn

เปรียบเทียบคำ (regexp)

การเปรียบเทียบตัวหนังสือจะใช้ eq (equal เท่ากัน) , ne (not equal ไม่เท่ากัน) แต่ตัวเลขจะใช้ == , >=, <=, >, <, != โดยตัวเลขจะมีเครื่องหมายคำพูดหรือไม่ก็ได้
print 'yes' if $var==1;


การเปรียบเทียบคำ แบบ regular expression (เขียนย่อๆว่า regexp) สามารถเปรียบเทียบค่าที่ซับซ้อนขึ้นได้ ซึ่งถือเป็นคุณสมบัติที่โดดเด่นของ perl ที่โปรแกรมอื่นๆรวมทั้ง php ต้องนำไปเป็นแบบอย่าง

regexp จะใช้ /../ เป็นตัวเปรียบเทียบ ปกติจะใช้เป็นเงื่อนไขภายใต้ if หรือ while

ตัวอย่างข้างล่าง แสดง regexp คือ /^$/ โดย ^ หมายถึงขึ้นต้นบรรทัด และ $ หมายถึงจบบรรทัด รวมความได้ว่า บรรทัดที่ขึ้นต้นแล้วจบบรรทัดทันที ไม่มีข้อมูลอะไร ให้หยุด (ด้วย last) แล้วออกจาก loop
while (<>) {
   last if /^$/;
   print $_;
}






อีกตัวอย่างเปรียบเทียบหมายเลข IP
$IP='1.1.1.1';
print $1 if $IP=~/^(\d+\.\d+\.\d+\.\d+)/;




อธิบายได้ว่า
regexp จะมีเครื่องหมายเฉพาะตัวของมัน ดูได้จากคู่มือ perl ในส่วนของ perlrequick
\d = digits = [0-9]
\s = whitespace = [\ \t\r\n\f]
\w = word = [0-9a-zA-Z_]
\D = non-digit = [^0-9]
\S = non-whitespace = [^\s]
\W = non-word = [^\w]
. = ทุกตัวอักษรยกเว้น "\n", ส่วน \. คือ .

เครื่องหมายนับจำนวน
a? = พบ 'a' 0 หรือ 1 ครั้ง
a* = พบ 'a' ตั้แต่ 0 ครั้งขึ้นไป
a+ = พบ 'a' ตั้งแต่ 1 ครั้งขึ้นไป
a{n,m} = พบอย่างน้อย n ครั้ง แต่ไม่เกิน m ครั้ง
a{n,} = พบมากกว่า n ครั้ง
a{n} = พบ n ครั้ง

ส่งอีเมล

การส่งอีเมลจาก perl สามารถใช้โมดูลต่างๆ หรือ ใช้คำสั่งที่ติดมากับ perl เลยก็ได้ คำสั่งที่ติดมากับ perl อาจจะเขียนยาวสักหน่อย แต่เวลาใช้จริงไม่ต้องเขียนใหม่ แค่ลอกจากตัวอย่างข้างล่างไปใช้ได้เลย
open SENDMAIL, "|/usr/local/sbin/sendmail -f user1\@domain user2\@domain" or die "cannot send mail";
print SENDMAIL <<EOF;
From: user1\@domain
To: user2\@domain
Subject: hello
X-origin: $ENV{'SCRIPT_NAME'} #สำหรับส่งเมลจาก apache

ทดสอบ
EOF
close(SENDMAIL);












หมายเหตุ

อ่านไฟล์

อ่านแต่ละบรรทัด เข้าไปใน array ชื่อ @lines
open FILE, 'data.txt' or die "$!";
@lines = <FILE>;
close FILE;





หมายเหตุ: คำว่า FILE จะใช้คำอื่นแทนก็ได้ และเวลาทดสอบสริป ควรใส่ or die "$!" เพื่อแสดง error เสมอ เวลาทำอะไรผิด จะได้หาสาเหตุเจอง่ายขึ้น

อ่านไฟล์แบบมีเงื่อนไข
open FILE, $filename or die "$!";
while (<FILE>) {
chomp; # ตัด \n ทิ้ง
$lines.=$_ ; # นำแต่ละบรรทัดมาต่อกัน
}
close FILE;






เขียนไฟล์

การเขียนไฟล์ สามารถเลือกได้ว่า จะเขียนตั้งแต่ต้น (ใช้ >) หรือจะเขียนต่อท้าย (ใช้ >>)
open DAT, '>>data.txt'; # เขียนต่อท้าย
print DAT "hello\n";
close DAT;





การเขียนไฟล์บน command line จะไม่มีปัญหาเรื่องสิทธิ์การเข้าถึงไฟล์ (permission) แต่การเขียนเวปไซต์ มักจะมีปัญหาเรื่องนี้ เพราะ web server ทำงานแบบถูกจำกัดสิทธิ์ เพื่อป้องกันเวลาโดนเจาะแล้ว ผู้เจาะสามารถเข้ามาทำอันตรายกับส่วนกลางได้ ทางแก้เรื่องสิทธิ์มีหลายวิธี เช่น บน unix ใช้ chmod a+w (ย่อมาจาก all+write) เพื่อให้ทุกคนรวมทั้ง web server เขียนไฟล์นี้ได้ กับอีกวิธีคือ ตั้งค่าบน web server ให้เวปไซต์นั้นทำงานแบบ suexec คือสามารถใช้ perl เขียนทุกไฟล์บนพื้นที่ได้โดยไม่ต้อง chmod ซึ่งไม่ว่าวิธีไหนก็ตาม ถ้าสคริปมีจุดโหว่ บุคคลภายนอกอาจสามารถใช้สคริปตัวนั้น ลบข้อมูลบนเวปไซต์ได้ แต่วิธี suexec จะเสี่ยงกว่าเพราะลบได้ทุกไฟล์

โมดูล

perl มีเพียงคำสั่งพื้นฐาน เช่นเดียวกับภาษาอื่นๆ การใช้งานบางอย่าง หากเริ่มเขียนจากพื้นฐาน จะเสียเวลามาก ด้วยเหตุนี้ แต่ละภาษาจึงมีคนนำไปเขียนเป็นเครื่องมือใหม่ เพื่อแจกจ่ายให้คนอื่นที่ต้องการใช้แบบเดียวกัน สามารถเรียกใช้งานได้เลย โดยไม่ต้องเริ่มเขียนใหม่จากศูนย์ เรียกเครื่องมือเหล่านี้ว่า library ส่วนใน perl จะเรียกว่า โมดูล โมดูลของ perl รวบรวมไว้ที่ cpan.org การเรียกใช้โมดูล จะต้องมีโมดูลตัวนั้นติดตั้งไว้ในเครื่องก่อน แล้วเรียกโดยใช้คำว่า use
  use CGI; # เรียกโมดูล CGI.pm



แต่ถ้าเรียกจากคำสั่งบน command line จะใช้ -M ตามด้วยชื่อโมดูลโดยไม่เว้นช่องว่าง

perl -MCGI -e "print 'hello';"

ถ้าไม่มีโมดูลติดตั้งในเครื่อง จะมีข้อความ error ขึ้นมาเช่น Can't locate CGI.pm in @INC (@INC contains: /usr/local/lib/perl5/5.8.8/BSDPAN /usr/local/lib/perl5/site_perl/5.8.8/mach /usr/local/lib/perl5/site_perl/5.8.8 /usr/local/lib/perl5/site_perl /usr/local/lib/perl5/5.8.8/mach /usr/local/lib/perl5/5.8.8 .). แปลว่า หาจนทั่วหลายโฟลเดอร์แล้วไม่เจอ รายชื่อโฟลเดอร์จะอยู่ใน array ชื่อ @INC

ถ้าผู้ใช้ติดตั้งโมดูลไว้ในพื้นที่ของตัวเอง จะต้องแก้ @INC ให้ระบุตำแหน่งค้นหาในพื้นที่ของตัวเองด้วย โดยเพิ่มคำสั่ง
  use lib '.'; # จุดคือเริ่มค้นหาจากพื้นที่ปัจจุบัน



เสร็จแล้วลองสั่งพิมพ์ @INC ดูจะเห็นว่า มี . เพิ่มขึ้นมาข้างหน้า นั่นคือ perl จะมาหาโมดูลในพื้นที่ของตัวเองก่อน ถ้าพิมพ์จาก command line จะใช้คำสั่ง

perl -Mlib=. -le "print for @INC"

ทำเวปไซต์

การทำเวปไซต์ด้วย perl ในอดีต จะใช้ cgi ซึ่งไม่สามารถดู error ได้จากหน้าจอ และไม่สามารถเขียนปะปนกับภาษา html ได้ ต่อมาเปลี่ยนมาใช้ mod_perl ซึ่งเรียกได้เร็วขึ้น เพราะไม่ต้องเรียก perl ใหม่ทุกครั้ง แต่ยังไม่สามารถดู error ได้จากหน้าจอยกเว้นจะใช้โมดูลเสริมอย่าง CGI::Carp

ปัจจุบัน perl ที่ brinkstudio.com ใช้ Mason ซึ่งสามารถดู error ได้จากหน้าจอได้เลย และใส่คำสั่งแทรกลงในภาษา html ได้โดยตรง แต่ก็มีข้อเสียเหมือนกันคือ บางคำสั่งที่ใช้บน command line ได้ แต่ใช้กับ mason ไม่ได้ เช่น MIME::Base64::encode("ภาษาไทย"); หรือ $ENV{'PATH_INFO'} ที่เป็นภาษาไทยจะไม่เหมือนกับภาษาไทยที่เขียนในไฟล์ ดังนั้น ใครที่มีปัญหา สามารถกลับมาใช้ mod_perl ได้ แต่ต้องตั้งค่า .htaccess เอาเอง

วิธีใช้ เริ่่มจากตั้งชื่อไฟล์นามสกุล .pl แล้วเขียนดังตัวอย่างต่อไปนี้
<%perl>
$var='sunday';
</%perl>

<html>
<body>
Today is <%$var%>
</body>
</html>







 



หมายเหตุ
การดึงไฟล์อื่นมาร่วมประมวลผลในสคริป จะใช้
  <& header.inc &>



การรับข้อมูลจากการ POST จะใช้โมดูล CGI.pm
  use CGI qw(:standard Vars);
my %FORM = Vars();



ฐานข้อมูล

ฐานข้อมูล ใช้เก็บข้อมูลแยกออกจากสคริป เพื่อเวลาแก้ไขจะได้ไม่ต้องไปยุ่งกับสคริป การจะเลือกฐานข้อมูลประเภทใด ขึ้นอยู่กับความต้องการใช้ ถ้าแค่อ่านและเขียนเพิ่มเข้าไป ใช้ไฟล์ text ธรรมดาก็ได้ (เช่น นามสกุล .txt) แต่ถ้าต้องการแก้ไขบ่อยๆ หรือ ค้นหาจาก key ด้วย จะเก็บข้อมูลเป็นคู่ key กับ value ถ้าข้อมูลไม่เยอะมาก อาจจะค้นหาจาก value ด้วย กรณีนี้ใช้ oracle db จะเหมาะกว่า การเชื่อมต่อกับ db นั้นเขียนง่ายมาก
use DB_File; # เรียกใช้โมดูล
tie %h, "DB_File", "/path/to/file", O_RDWR|O_CREAT, 0644, $DB_HASH;




บรรทัดที่ 2 แปลว่า
ปัญหาของ O_CREAT จะเกิดขึ้น เมื่อเขียน db จากเวปไซต์ แล้วไม่มีสิทธิ์เขียนไฟล์ลงบนพื้นที่ กรณีนี้ให้สร้างโฟลเดอร์ย่อยขึ้นมา แล้ว chmod a+w เพื่อให้ web server เขียนลงโฟลเดอร์นั้นได้

เมื่อเชื่อมต่อฐานข้อมูลได้แล้ว คราวนี้ก็ง่าย แค่ใช้คำสั่งจัดการกับ hash ธรรมดา เช่น
$h{'thai'}='baht'; #เพิ่มค่าใหม่
delete $h{'us'}; # ลบค่าเก่า



Sub

sub ย่อมาจาก subroutines คือ การสร้างคำสั่งใหม่ขึ้นมา เพราะคำสั่งเดิมไม่มีให้ใช้ หรือยืดยาวเกินไป จึงต้องแยกออกมาเพื่อให้อ่านง่ายขึ้น รูปแบบการใช้คือ sub ตามด้วยคำสั่งใหม่ และเวลาเรียกใช้ ก็เรียกคำสั่งใหม่ แบบเดียวกับเรียกใช้คำสั่งที่ติดมากับ perl
sub cmd {
    print 'hello';
}
cmd;






sub จะอยู่ตรงไหนของไฟล์ก็ได้ แต่ควรอยู่ด้านบนสุด ก่อนจะถูกเรียกใช้จะดีที่สุด เพราะ perl จะอ่าน sub ก่อน ทำให้รู้จัก sub เหมือนเป็นคำสั่งที่ติดมาในตัวมัน หากใส่ sub ไว้ด้านล่าง แล้วเรียกใช้งานก่อนที่จะประกาศชื่อ sub ออกไป perl จะแสดงพฤติกรรมประหลาด เช่น เวลาเรียกใช้จะต้องใส่ () กลายเป็น cmd(); ไม่เช่นนั้นจะเกิด error ขึ้น หรือ เวลาเขียนผิด จะแสดง error เพี้ยนไปทำให้ไม่เข้าใจ ตัวอย่างที่เห็นได้ชัดคือ sub ใช้ชื่อซ้ำกับคำสั่งที่ติดมากับ perl หากใช้ use warnings; แล้วลองเรียกก่อนและหลังประกาศ sub จะเห็นความแตกต่าง

เวลาเรียกใช้งาน สามารถส่งค่า ไปประมวลผลใน sub ได้ด้วย โดย sub จะเห็นค่าที่ส่งมาในรูปของ @_  ซึ่งเป็น array ตัวอย่างการใช้งานจริงเช่น คำสั่ง print จะไม่เว้นบรรทัด การเว้นบรรทัดจะต้องเพิ่ม \n เข้าไปด้านท้ายกลายเป็น print "...\n" แต่เวลารีบๆจะเสียเวลาไปกับการพิมพ์มากขึ้น โชคดีที่ perl6 มีคำสั่งใหม่ออกมาคือ say '...' ซึ่งเท่ากับ print "...\n" แต่ปัจจุบัน (พศ.2559) ยังไม่มีใครใช้ perl6 กัน เพราะ มีหลายโปรแกรมที่ยังคงตั้งค่าให้ยึดกับ perl5 อยู่ แต่คนที่ใช้ perl5 สามารถแก้ไขปัญหานี้ได้ โดยใช้ sub สร้างคำสั่งใหม่ขึ้นมาเป็น echo เวลาใช้งานจริงก็แค่ใส่ sub echo ไว้ที่หัวไฟล์
  echo ('thai', 'us');
sub echo {print "$_\n" for @_}
# หรือถ้าเขียนไว้ใต้ sub จะเป็น
echo 'thai', 'us';






ถ้า sub ใช้ชื่อซ้ำกับคำสั่งหลักของ perl เช่น sub tell {...} ซ้ำกับคำสั่ง tell ที่ติดมากับ perl การเรียกใช้ tell จะไม่ไปเรียกจาก sub แต่จะเรียกจากคำสั่งที่ติดมากับ perl

แก้ปัญหา

เมื่อ perl ที่ใช้ผ่าน command line ไม่แสดงผลตามต้องการ ขั้นแรกให้เปิดแสดงรายละเอียดเพิ่มเติม โดยใช้ use warnings; ลองดูตัวอย่างข้างล่างนี้ คือการเขียน sub tell {...} ซ้ำกับค่า tell ที่ติดมากับ perl เมื่อเรียกจาก command line จะเงียบ ไม่แสดงผลอะไรออกมา แต่เมื่อเปิด warnings แล้วจะเห็นข้อความเตือนขึ้นมาว่าซ้ำกับ CORE::tell() ซึ่ง core คือคำสั่งที่ติดมากับ perl
  use warnings; # ควรเขียนไว้บนสุดของหน้า
sub tell {print 'hello';}
tell;





การเขียน perl เป็นเรื่องเป็นราว เมื่อเขียนยาวขึ้น ตัวแปรอาจจะตีกัน โดยเฉพาะตัวแปรที่อยู่ใน sub ที่สามารถปะปนกับตัวแปรข้างนอกได้ การใช้ strict; จะลดปัญหาลงได้ เพราะ ตัวแปรใน sub จะถูกจำกัดอยู่แค่ใน sub ไม่มีค่าข้างนอก แต่การใช้ strict จะต้องเขียน my ไว้ข้างหน้าตัวแปรที่พบเป็นครั้งแรกเสมอ ถ้าลืมเขียน จะขึ้น error ...requires explicit package name at...
  use strict; # เขียนไว้บนสุดของหน้า
my $var='hello';
print $var;






เขียน 15 พค.59