Line Filters

Line Filters #

// _line filter_ ဆိုတာ stdin ကနေ input ကိုဖတ်ပြီး၊ process လုပ်ကာ
// ရလဒ်ကို stdout ပေါ်မှာ print ထုတ်တဲ့ ပုံစံမျိုးဖြစ်ပါတယ်။ `grep` နဲ့ `sed` တို့က
// အသုံးများတဲ့ line filter တွေဖြစ်ပါတယ်။

// ဒီနေရာမှာ Go နဲ့ရေးထားတဲ့ line filter နမူနာတစ်ခုပြထားပါတယ်။
// ဒီ code က input text အားလုံးကို စာလုံးအကြီးပြောင်းပြီး ရေးထုတ်ပေးပါတယ်။
// ဒီပုံစံကိုသုံးပြီး သင့်ရဲ့ကိုယ်ပိုင် Go line filter တွေရေးနိုင်ပါတယ်။

package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"
)

func main() {
	// Buffering မလုပ်ထားတဲ့ `os.Stdin` ကို buffered scanner နဲ့ wrap လုပ်ထားတာက
	// အဆင်ပြေတဲ့ `Scan` method ကိုပေးပါတယ်။ ဒီ method က scanner ကို နောက် token ဆီရွှေ့ပေးပါတယ်။
	// ပုံမှန်အားဖြင့် နောက် line ဆီကိုရွှေ့ပေးတာပါ။
	scanner := bufio.NewScanner(os.Stdin)
	for scanner.Scan() {
		// `Text()` က လက်ရှိ token ကိုပြန်ပေးပါတယ်။ ဒီနေရာမှာတော့ နောက် line ကိုပြန်ပေးတာဖြစ်ပါတယ်။
		ucl := strings.ToUpper(scanner.Text())
		// စာလုံးအကြီးပြောင်းထားတဲ့ line ကို ရေးထုတ်ပါတယ်။
		fmt.Println(ucl)
	}
	// `Scan` လုပ်နေစဉ် error ဖြစ်မဖြစ်စစ်ပါတယ်။ file အဆုံးရောက်တာကို
	// `Scan` က error အဖြစ်မသတ်မှတ်ပါဘူး။
	if err := scanner.Err(); err != nil {
		fmt.Fprintln(os.Stderr, "error:", err)
		os.Exit(1)
	}
}
# ကျွန်ုပ်တို့ရဲ့ line filter ကို စမ်းသပ်ရန်၊ 
# ပထမဆုံး စာလုံးအသေး အနည်းငယ်ပါသည့် 
# ဖိုင်တစ်ခုကို ဖန်တီးပါမယ်။
$ echo 'hello'   > /tmp/lines
$ echo 'filter' >> /tmp/lines

# ထို့နောက် line filter ကို 
# အသုံးပြု၍ စာလုံးအကြီးများ ရယူပါမယ်။
$ cat /tmp/lines | go run line-filters.go
HELLO
FILTER