เรียนเขียนโปรแกรม

วิธีเลือกภาษา

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

ภาษาที่เยิ่นเย้ออย่าง java และ c# ที่ถึงแม้จะ backward compatible แต่ต้องเขียนยาวกว่าภาษาทั่วไป ทำให้อ่านยากกว่า และโอกาสผิดพลาดมากกว่า ยกตัวอย่าง java ถูกออกแบบให้เขียนครั้งเดียวแต่ใช้ได้กับทุกเครื่อง โดยทำงานผ่าน vitual machine ซึ่งฟังดูดี แต่เวลาใช้งานจริงจะพบว่า ทำชีวิตเสียเวลามาก แค่จะแสดงผลประโยคเดียว ต้องเขียนยืดยาวทั้ง public static void main String[] args ทั้งที่ละไว้เป็นค่าเริ่มต้นได้ เวลาเรียกใช้ต้อง compile แปลงเป็นภาษาเครื่องก่อน แล้วเรียกอีกรอบ จึงจะแสดงผลได้ ซึ่งไม่ใช่ปัญหาใหญ่ ปัญหาใหญ่คือ compile อืด หากเปรียบเทียบจะพบว่า perl ฉลาดกว่าและใช้งานได้ไวกว่ามาก ส่วน c# เลียนแบบมาจาก java เป็นลักษณะลูกผสมระหว่าง c++ กับ java เขียนยืดยาวน้อยกว่า java เล็กน้อย

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

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

เริ่มจาก perl

perl เป็นภาษากลางที่เหมาะนำมาใช้เรียนเขียนโค้ดจากศูนย์ เพราะ syntax (รูปแบบคำสั่ง) หลักๆอย่าง if ตามด้วยวงเล็บ ( ) กับปีกกา { } ปิดด้วย semicolon ; เหมือนกับภาษาอื่นๆ เรียนแล้วต่อยอดไปได้ทุกภาษา ไล่ตั้งแต่ c, java หรือแม้แต่ python ที่แค่ลอกตามๆมาจากภาษาอื่นแล้วตัดวงเล็บกับปีกกาออก และที่สำคัญคือ perl เรียนเข้าใจง่ายกว่าภาษาอื่น เพราะเขียนสั้นกะทัดรัด ไม่มี syntax ส่วนเกิน (noise) อย่าง import หรือ main() ที่ทำให้ผู้เรียนสับสนกับโครงสร้าง แค่เขียนโครงสร้างที่จำเป็นอย่าง if else จะสามารถใช้งานได้เลย เปรียบเหมือนเรียนขับรถเกียร์ออโต้ จะเป็นเร็วกว่าเกียร์กระปุก

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

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

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

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

ผู้เขียนเริ่มเขียนภาษา perl มาตั้งแต่ก่อนปี ค.ศ.2000 เนื่องจากสมัยก่อนยังไม่มี php ต่อมาหลังปี ค.ศ.2003 php3 เริ่มดังขึ้น จึงเปลี่ยนมาเขียน php สาเหตุที่ทำให้ php โด่งดังขึ้น และ perl ถูกลืมไป คือ
ปัญหาใหญ่ที่สุด ที่พบจากการเขียน 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
@array=("baht\n", "dollar\n");

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

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


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

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

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

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

javascript เป็นภาษาที่เริ่มมาจากทำงานในเครื่องฝั่งผู้ใช้ (ช่วงหลังเริ่มมีการนำมาใช้ฝั่ง server) แต่บนฝั่งผู้ใช้ ยังไม่เหมาะจะใช้งานจริงจัง เพราะแต่ละ browser รองรับคำสั่งใหม่ๆได้ไม่พร้อมกัน คำสั่งพื้นๆที่พอจะใช้งานได้ ก็ยังออกแบบมาได้ไม่ดีนัก เช่น
perl
$str = '2'; # หรือ $str = 2
print $str.1; # แสดงผลเป็น 21
print $str+1; # แสดงผลเป็น 3
javascript
str='2'
alert(str+1)         // แสดงผลเป็น 21
alert(Number(str)+1) // แสดงผลเป็น 3

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

ผู้เขียนไม่นิยม python เพราะเหมือนสร้างโดยเผด็จการ fascist ที่บังคับให้ต้องอยู่ในกรอบที่เขากำหนด ไม่เช่นนั้นจะใช้งานไม่ได้ ชีวิตไม่มีทางเลือก เช่น เวลาจำเป็นต้องหา error ตามวิธีการที่ใช้กันทั่วโลกคือ เขียน print ชั่วคราวตรงจุดเริ่มต้นของบรรทัด เพื่อให้เห็นง่าย จะได้ลบออกง่าย แต่ไม่สามารถทำได้ เพราะถูกบังคับให้มีย่อหน้าหรือ indent อย่างน้อย 1 ช่องว่าง โดยที่เจ้าของภาษาไม่เข้าใจธรรมชาติของการเขียนโค้ดว่า ย่อหน้าใช้เพื่อรวมคำสั่งคล้ายกันไว้ แต่การ debug ไม่ได้อยู่ในกลุ่มเดียวกัน จึงไม่สมควรรวมไว้ด้วยกัน ต่างจาก perl ที่ให้อิสระทางความคิดเต็มที่ แต่ใครที่ไม่กล้าออกจากกรอบคงเห็นว่าไม่จำเป็น

perl
if ($x==0) {      # ไม่ error แยกแยะได้
print("hello");   # แสดงผลเป็น hello
  print 'world'   # แสดงผลเป็น world
  print "ไทย"; # รู้จักทั้ง ANSI และ UTF-8
}
python 3+
if x==0:  # error name 'x' is not defined
print("hello")     # เขียนแบบนี้ไม่ได้ ต้องมีย่อหน้า
   print "world"   # เขียนแบบนี้ไม่ได้ ต้องมีวงเล็บ
   print("ไทย") # error ไม่รองรับภาษาไทยแบบ ANSI


ปัญหาสำคัญที่สุดที่ผู้เขียนไม่ใช้ python คือไม่มี backward compatibility ยกตัวอย่างในเครื่องผู้เขียนจะมีทั้ง python 2.7, 3.7 และ 3.7m เพราะมีซอฟท์แวร์บางตัวต้องใช้ ซึ่งแสดงให้เห็นว่าแต่ละ version ไม่สัมพันธ์กัน แต่เมื่อทดลองเขียนบน 2.7 ใช้ print "hello" แล้วใช้ได้ปกติ แต่เมื่อใช้กับ 3.7 จะ error บังคับให้ต้องมีวงเล็บ ใครที่เพิ่งหัดเขียนใหม่คงไม่เห็นความจำเป็น แต่ใครที่เคยเขียนมาสัก 10 ปีแล้วเจอแบบนี้ ต้องส่ายหัว เพราะการแก้ไขคำสั่งเก่าไม่ใช่เรื่องสนุก แม้แต่คนที่หัดเขียนใหม่แล้วติดปัญหา พอไปหาในเน็ต อาจได้คำตอบไม่ตรงกับ version ที่ใช้ จึงนำมาใช้กันไม่ได้ ทำเสียเวลา

python ไม่บังคับเครื่องหมาย ; ปิดบรรทัดเหมือนอย่างภาษาอื่น คือจะใส่หรือไม่ก็ได้ ถ้าไม่ใส่จะใช้การเว้นบรรทัดแทนได้ ซึ่งดูเหมือนง่าย แต่เวลาผิดพลาดขึ้นมา อย่างการย้ายโค้ดที่เขียนบน unix ซึ่งเว้นบรรทัดด้วย \n มาเปิดบน windows ซึ่งเว้นบรรทัดด้วย \r\n จะทำให้ทุกบรรทัดย้ายมากองรวมกันติดกันเป็นบรรทัดเดียว ถึงตอนนั้นจะแยกบรรทัดไม่ไหว

การออกแบบภาษาผิดตั้งแต่แรก ที่ให้มีวงเล็บกับเครื่องหมายคำพูดปนมาแบบเดียวกับ javascript ทำให้ต้องเขียนยาวขึ้น เรื่องความฉลาดก็เพิ่งจะไล่ตาม perl ยกตัวอย่าง การแปลง a@b เป็น b_a เขียนด้วย perl คือ s/(\d+)@(\d+)/$2_$1/ ส่วน python เพิ่งจะเริ่มทำได้ใน version 3 โดยใช้ re.sub()

คู่มือ

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

โมดูลต่างๆ ช่วยให้ชีวิตง่ายขึ้น สามารถดาวโหลดและดูคู่มือของแต่ละโมดูลได้ที่ www.metacpan.org

เครื่องมือ

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

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

เริ่มเขียน

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

เปิดโปรแกรม  text editor เขียนข้อความดังต่อไปนี้ สังเกตุว่า คำสั่งใน perl ต้องมี ; ด้านท้ายเพื่อจบคำสั่ง ถ้าไม่มีแสดงว่ายังไม่จบคำสั่ง สามารถเว้นบรรทัดเพื่อเขียนต่อในบรรทัดถัดไปได้
print 'hello';
จะใช้เครื่องหมายคำพูดคู่คือ "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 ... แสดงว่า บรรทัดสุดท้าย ยังไม่ได้ขึ้นบรรทัดใหม่

การพิมพ์ command line ขึ้นต้นด้วย perl จะยาวเวลาต้องใช้กับหลายๆไฟล์ ผู้เขียนจะทำ shortcut เป็นทางลัดไว้ให้เรียกจากคำว่า pl แทน perl กลายเป็นเรียก pl test.pl โดยดูวิธีทำ shortcut จากคู่มือของ command line แต่ละตัวว่าเขียนอย่างไร ยกตัวอย่าง bash จะใช้ alias pl="perl" ลงในไฟล์ profile ในโฟลเดอร์ส่วนตัว (เช่น /root/.profile บน freebsd)

เวลาใช้งานแบบอัตโนมัติ เช่น เรียกผ่านเวป หรือ โปรแกรมอื่นๆ จะไม่พิมพ์ 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';"

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

การทำ interactive shell แบบที่พิมพ์คำสั่งลงไปบนหน้าจอได้เลย จะใช้ perl คำเดียว พอเลิกจึงกด ctrl+d (เฉพาะ unix) แต่จะแสดงผลเฉพาะตอนเลิก ถ้าจะให้แสดงผลทันทีใช้

perl -de1


ผู้เขียนได้รวบรวมคำสั่งที่ใช้บ่อย รวมทั้งเคล็ดลับและข้อควรระวัง ทั้งจากในอินเตอร์เน็ตและจากประสบการณ์ ดังต่อไปนี้ แต่จะขออธิบายเฉพาะหัวใจสำคัญ เพื่อให้ผู้อ่านมือใหม่ใช้เป็น เพราะถ้าเขียนหมดจะยาวมาก รายละเอียดเพิ่มเติม สามารถดูได้จากในคู่มือ 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 รวบรวมไว้ที่ metacpan.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 ต่อมาเปลี่ยนไปใช้ Mason ซึ่งสามารถดู error ได้จากหน้าจอได้เลย และใส่คำสั่งแทรกลงในภาษา html ได้โดยตรง แต่ก็มีข้อเสียเหมือนกันคือ บางคำสั่งที่ใช้บน command line ได้ แต่ใช้กับ mason ไม่ได้ เช่น MIME::Base64::encode("ภาษาไทย"); หรือ $ENV{'PATH_INFO'} ที่เป็นภาษาไทยจะไม่เหมือนกับภาษาไทยที่เขียนในไฟล์ ดังนั้น ทางบริ๊งจึงเปลี่ยนกลับมาใช้ mod_perl ซึ่งคำสั่งที่ทดสอบบน command line สามารถใช้บนหน้าเวปไซต์ได้เลย

สิ่งที่ผิดพลาดกันบ่อยทำให้เกิด 500 server error คือ ไม่ได้แปลงไฟล์บน server ให้ executable (ด้วย chmod 755), และไม่ได้แปลงไฟล์ด้วย text editor ให้เป็นระบบ unix (คือแปลงจาก CRLF เป็น LF) และต้องมีการเพิ่ม http header ลงไปด้านบนสุด ต่อจากตำแหน่งของ perl ถ้าจะใช้ charset=utf-8 ต้องแปลงไฟล์ด้วย text editor เป็น utf-8
  print "Content-type: text/html; charset=utf-8\n\n";
use strict;




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



ฐานข้อมูล

ฐานข้อมูล ใช้เก็บข้อมูลแยกออกจากโค้ด เพื่อเวลาแก้ไขจะได้ไม่ต้องไปยุ่งกับโค้ด การจะเลือกฐานข้อมูลประเภทใด ขึ้นอยู่กับความต้องการใช้ ถ้าแค่อ่านและเขียนเพิ่มเข้าไป ใช้ไฟล์ text ธรรมดาก็ได้ (เช่น นามสกุล .txt) แต่ถ้าต้องการแก้ไขบ่อยๆ หรือ ค้นหาจาก key ด้วย จะเก็บข้อมูลเป็นคู่ key กับ value ถ้าข้อมูลไม่เยอะมาก อาจจะค้นหาจาก value ด้วย กรณีนี้ใช้ db1 (db version 1) จะดีที่สุด เพราะไม่เปลี่ยนตามกาลเวลา แต่ถ้าต้องการเก็บข้อมูลซับซ้อนขึ้นอาจใช้ oracle db ซึ่งยังนิยมเรียกกันว่า berkeley db (bdb) ตามชื่อของผู้คิดค้นแล้ว oracle เพิ่งไปซื้อต่อมา หลังจากนั้นเริ่มมีปัญหา เช่นเปลี่ยนจาก db4 เป็น db5 แล้วไม่คง backward compatibility ไว้ทำให้หลายโปรแกรมตอนนี้ที่ใช้ bdb ทำงานแล้วพัง การเชื่อมต่อกับ 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 จะอยู่ตรงไหนของไฟล์ก็ได้ อยู่ด้านล่างจะอ่านง่ายที่สุด แต่เวลาเรียกใช้จากด้านบน จำเป็นต้องใส่ () กลายเป็น cmd() ไม่เช่นนั้นจะเกิด error ขึ้น ถ้าจะให้แน่นอนที่สุด ควรเขียน sub อยู่บนสุดก่อนจะถูกเรียกใช้ เพราะ perl จะอ่าน sub ก่อน ทำให้รู้จัก sub เหมือนเป็นคำสั่งที่ติดมาในตัวมัน หากใส่ sub ไว้ด้านล่าง แล้วเรียกใช้งานก่อนที่จะประกาศชื่อ sub ออกไป perl จะแสดงพฤติกรรมประหลาด เช่น เวลาเขียนผิด จะแสดง 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;






เกี่ยวกับผู้เขียน

ผู้เขียนทำงานที่บริ๊งสตูดิโอ เขียนโปรแกรมทั้งหมด 7 ภาษาคือ c, c++, c#, perl, php, javascript, kotlin เพื่อใช้งานทั้งฝั่ง server และ client ไม่รวมภาษายิบย่อยเช่น css, shell script ฯลฯ ส่วนภาษาอื่่นอย่าง python นั้นไม่มีอะไรยาก


เริ่มเขียน 15 พค.59

เรียนเพิ่มเติม

fastcode 10x เรียนเขียนโปรแกรมเร็วขึ้น 10 เท่า