ในกรณีที่เราต้องการเรียงข้อมูลที่มีหลายคอลัมน์นั้น (ในกรณีที่เราเก็บข้อมูลเป็นตัวแปรอะเรย์แบบ Hash หรือ Associate Array) เราจะต้องทำการบอกมันด้วยว่าเราต้องการเรียงลำดับข้อมูลจาก keys ไหนของ Array เช่น
# ข้อมูลใน report.txt # Tony###Owen###Oxford University###2550 # Louise###Scott###Chularlongkorn University###2549 # David###Scott###Burapha University###2548 # Alan###Bill###Cambridge University###2552 # ซึ่งกำหนดให้ # คอลัมน์แรกเป็น Name # คอลัมน์สองเป็น Surname # คอลัมน์สามเป็น University # คอลัมน์สี่เป็น Since_in
เมื่อเรามีข้อมูลแล้วเราต้องทำการเก็บข้อมูลใส่ตัวแปรอะเรย์ก่อน
open(<RPT>, "report.txt"); flock(RPT, 2); @rpt = RPT; flock(RPT, 8); close (RPT); # ทำการกำหนดว่าเราต้องการเรียงลำดับอะไร และเรียงจากน้อยไปมาก หรือมากไปน้อย $sorting = "asc"; $sort_by = "Name"; # สั่งให้จัดข้อมูลใหม่ โดยให้เรียงตามเงื่อนไขที่เราต้องการ @sort_rpt = sort sorter @rpt; # โดยที่ sort คือคำสั่งในการเรียงของตัวแปรภาษา, sorter คือชื่อ sub ที่เรากำหนดให้ทำการเรียง, # @rpt คือตัวแปรที่เราต้องการเรียง เพียงเท่านี้เราก็จะได้ข้อมูลที่เรียงลำดับตาม ชื่อ ที่เราต้องการแล้ว
จากนั้นให้ทำการสร้าง sub ที่ใช้สำหรับเลือก Sort keys ที่ต้องการ
sub sorter {
# ทำการเก็บค่าที่ได้จากการตัดคำมาเก็บไว้ในตัวแปรแต่ละตัว (ซึ่งจะใช้ในการเรียงข้อมูล)
($name1, $surname1, $university1, $since_in1) = split(/###/, $a);
# เป็นการบอกว่าตัวแปร $a นั้นเป็นเรคอร์ดปัจจุบัน
($name2, $surname2, $university2, $since_in2) = split(/###/, $b);
# เป็นการบอกว่าตัวแปร $b นั้นเป็นเรคอร์ดต่อไป
# ซึ่งเราจะต้องใช้เรคอร์ดปัจจุบัน กับเรคอร์ดต่อไปในการเรียงข้อมูลไปเรื่อย ๆ จนครบจำนวนแถว
if ($sort_by eq "Name") {
if ($sorting eq "asc") {
return (lc($name1) cmp lc($name2));
# เป็นการเรียงจากน้อยไปมาก
} else {
return (lc($name2) cmp lc($name1));
# เป็นการเรียงจากมากไปน้อย
}
} elsif ($sort_by eq "Surname") {
if ($sorting eq "asc") {
return (lc($surname1) cmp lc($surname2));
} else {
return (lc($surname2) cmp lc($surname1));
}
} elsif ($sort_by eq "University") {
if ($sorting eq "asc") {
return (lc($university1) cmp lc($university2));
} else {
return (lc($university2) cmp lc($university1));
}
} elsif ($sort_by eq "Since_in") {
if ($sorting eq "asc") {
return (lc($since_in1) cmp lc($since_in2));
} else {
return (lc($since_in2) cmp lc($since_in1));
}
}
}
Login
Search| ความเห็นของผู้อ่าน |
| ยังไม่มีความเห็นในบทความนี้ |
| Comment |