เขียน Perl ในสไตล์ HTML

การเขียน Perl รูปแบบมาตรฐาน


print "Content-type: text/html\n\n";

print "<html>\n";
print "<head>\n";
print "<title>เขียน Perl ในสไตล์ HTML</title>\n";
print "<meta http-equiv='Content-Type' content='text/html'; charset='Windows-874'>\n";
print "</head>\n";
print "<body>"
print "<font color='#000000' size='-2' face='MS Sans Serif'>\n";
print "Hello..o.o.o.o.o.o.o.";
..................
.................
.................
print "</font>\n";
print "</body>\n";
print "</html>\n";

- การเขียนแบบนี้ ต้องอยู่ภายใต้กฏที่เคร่งครัด
- หากบรรทัดไหนขาดเครื่องหมาย Semi-Colon ( ; ) ไป เจอ Error แน่ๆ (ตัวผมเองนั่นแหล่ะ..เจอประจำเลย)
- ดังนั้นผู้เขียน Perl ต้องคอยตรวจตรา Source Code ซ้ำแล้วซ้ำอีก กลัวพลาด

การเขียน Perl ในอีกรูปแบบหนึ่ง ที่ผมได้ไปเห็นมา

print <<"(code abcdef)";
Content-type: text/html

<html>
<head>
<title>เขียน Perl สไตล์ HTML</title>
<meta http-equiv='Content-Type' content='text/html'; charset='Windows-874'>
</head>
<font color='#000000' size='-2' face='MS Sans Serif'>
Hello..o.o.o.o.o.o.o.
..................
.................
.................
</font>
</body>
</html>
(code abcdef) <-- บรรทัดนี้เป็นบรรทัดที่ต้องระวังที่สุด

- ให้ผลลัพท์เหมือนกับ Source Code ข้างบนทุกประการ
- เริ่มต้นด้วย print <<"(Label Name)"; --> บรรทัดนี้เริ่มเขียนที่ Column ไหนก็ได้
- ตามด้荗ย Content-type: text/html ต้องอยู่ติดกับบรรทัด print <<"(Label Name)"; ต้องเริ่มต้นที่ Columnที่ 1. เท่านั้น
- ไส้ในเป็นแท็ก HTML มาตรฐาน
- ภายใน荴ส้ใน สามารถแสดงค่าตัวแปรของ Perl ที่ได้จากการคำนวณได้ด้วย
- จบด้ว荒 (Label Name)
- ต้องเริ่มเขียนที่ (Label Name) ที่ Column ที่ 1 เท่านั้น (เริ่มที่ตำแหน่งอื่น รันไม่ผ่าน)

ถ้ามีการเขียนเป็นช่วงๆ ไม่ใช่แบบม้วนเดียวจบ ก็สามารถทำได้เช่นกัน เช่น

print <<"(HTML Code-XX)";
Content-type: text/html

<html>
<head>
<title>เขียน Perl ในสไตล์ HTML</title>
<meta http-equiv='Content-Type' content='text/html'; charset='Windows-874'>
</head>
<font color='#000000' size='-2' face='MS Sans Serif'>
ทดสอบ
(HTML Code-XX)

.................................
Perl Command
.................................

       if ( ........)
       {
           print <<"(HTML Code-YY);
           <center>
           ทดสอบช่วงที่สอง.
           <......>
           <......>   
(HTML Code-YY)
       }
       else
       {

.................................
Perl Command
.................................

print <<"(HTML Code-XX)";
</font>
</body>
</html>
(HTML Code-XX)

- จะเห็草ว่า Label Name สามารถใช้ซ้ำกันได้ แต่ขึ้นต้นด้วยชื่อไหน ต้องจบลงด้วยชื่อนั้นสำหรับการพิมพ์ลงเป็นไฟล์ HTML สามารถทำได้ ดังนี้ครับ

open (FILE, "abc.html");

print FILE <<"(HTML Code-XX)";
..................
.................
(HTML Code-XX)

มีง่ายกว่านั้นอีกหลังจากผมส่งข้อมูลหน้านี้ขึ้นไปบนเวบได้ไม่นาน ก็มีท่านผู้เยี่ยมชมท่านหนึ่งแวะมาอ่าน และได้แนะนำข้อมูลไว้ว่า มีวิธี
การที่ง่ายกว่านั้นอีก เขียนแล้ว Source Code เป็นระเบียบ อ่านง่ายกว่าอีกต่างหาก วิธีการดังกล่าวคือ

print qq {

................
แท็ก HTML
................

};      --> สังเกตุดีๆนะครับ ต้องจบด้วยเครื่องหมาย Semi Colon ( ; )

ในกรณีเขียนลงไฟล์

open (FILE, "abc.html");
print FILE qq {

................
แท็ก HTML
................

};

ข้อสังเกตุ

- ต้องใช้ในรูปแบบของ print qq { .... }; เท่านั้น ซึ่งผมก็ไม่ทราบเหตุผลเหมือนกัน
- อย่าลืมจบด้วย Semi Colon ( ; ) นะครับ ขาดเครื่องหมายนี้ โปรแกรมจะไม่ทำงาน
- ไม่มีข้อกำหนดเรื่องตำแหน่งของ Column ที่อยู่ของคำสั่ง คือ อยู่ตรงไหนก็ได้

จะใช้เทคนิครูปแบบที่สอง .. อ่านตรงนี้ก่อน

ผมลองใช้เทคนิคในรูปแบบที่สองแล้วครับ ปรากฏกว่า
- IE แสดงข้อมูลถูกต้อง
- Netscape แสดงข้อมูลเพี้ยน

เพี้ยนอย่างไร?

ตอนผมทดสอบการเขียน Perl ด้วยรูปแบบที่สอง ด้วย Netscape ซึ่งในขณะนั้นเครื่องคอมพิวเตอร์ของผมติดตั้งโปรแกรม
- OmniHTTPd 2.06
- Perl for Win32 Build 316
อยู่ด้วย ผลปรากฏว่า สามารถแสดงข้อมูลได้อย่างถูกต้อง ผมจึงส่งไฟล์ขึ้นไปอัพเดทบน Hypermart และลองทดสอบดูด้วย Netscape อีกครั้งหนึ่ง ผลคือ Netscape แสดงข้อมูลออกมาเป็น Source Code แทน

อาการเช่นนี้ทำให้ผมงง
- หากบอกว่าเกิดจาก Netscape ไม่รู้จักคำสั่ง print qq { ......}; ทำไมเวลารันบนเครื่องผม จึงทำงานได้หล่ะ
- หากบอกว่าเกิดจาก Perl Interpreter บน Server ของ Hypermart ไม่รู้จักคำสั่ง print qq { ......}; ก็ไม่ใช่อีกนั่นแหล่ะ เพราะเมื่อใช้ IE เปิดดูแล้ว สามารถแสดงข้อมูลได้อย่างถูกต้อง
- ผมหาสาเหตุของการเกิดอาการเช่นนี้ไม่พบ หากท่านผู้อ่านท่านใดทราบ รบกวนช่วยแนะนำผมด้วยนะครับ

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

ผมยังไม่ละความพยายาม เนื่องจากผมชอบการเขียนในรูปแบบที่สองมากกว่ารูปแบบที่หนึ่ง จึงลองนำมาใช้ผสมกัน ปรากฏว่า "เวอร์ค"ครับ ปัจจุบัน Souce Code ของ Perl ในเวบนี้ ผมใช้ในรูปแบบ ดังนี้

print <<"(Label Name)";
Content-type: text/html

<html>
<head>
...............
..............
(Label Name)

.............................
Perl Command
.............................

print qq
{
................
แท็ก HTML
................
</head>
</html>
};

กล่าวคือ ขึ้นต้นด้วยรูปแบบแรก (print <<"(Label Name)";) หลังจากนั้นใช้รูปแบบที่สอง print qq { .... }; ตลอด

ลองเอาไปใช้ดูนะครับ หากมีเทคนิคอะไรเพิ่มเติม ส่งข่าวบอกให้ผมรู้ด้วยครับ