Thursday, October 18, 2012

Perl one-liner ( untuk Perl-geek sahaja :)

Semalam ada seorang kawan sefakulti mengemukakan satu masalah -
Bagaimanakah caranya menukar data yang terdiri daripada berbilang baris, kepada satu rentetan mengandungi data-data tersebut yang hanya diselangi dengan koma (tanpa penyuntingan)?

Seperti berikut: 

aaaaa
bbbbb
ccccc

kepada 

aaaaa,bbbbb,ccccc

Satu cara yang boleh digunakan ialah dengan menggunakan fungsi dlm MS-Excell (diperoleh daripada sumber di Youtube, terima kasih Dr. Alfian FSKTM).

Tetapi yang terlintas di fikiran saya ialah dengan menggunakan Perl one-liner. Perl one-liner ialah pembentukan skrip bahasa Perl yang ringkas dan mampu dilaksanakan secara terus menerusi prom arahan atau baris arahan sahaja (berbanding menulis di dalam fail skrip Perl, *.pl)

Skrip yang boleh digunakan adalah seperti berikut: ('multilines.txt' mengandungi data input, dan output akan disimpan dalam fail 'output.txt' tanpa mengubah kandungan 'multilines.txt')

perl -e "print(join(',', map{chomp; $_;} <>))" multilines.txt > output.txt

Skrip setara (tanpa kurungan '()'):

perl -e "print join ',', map{chomp; $_;} <>" multilines.txt > output.txt

Skrip di bawah memperoleh hasil yang sama, justeru boleh digunakan sebagai skrip alternatif (sebahagiannya telah diperbaiki oleh Dr. KA, FSKTM):

perl -e "$_ = join (',', <>); s/\n\r?//g; print" multilines.txt > output.txt

Berikut adalah contoh perlaksanaannya dalam prom arahan Windows (arahan 'more' sekadar memperlihatkan kandungan fail input, dan output yang terhasil):

C:\>more multilines.txt
xxxx
yyyy
zzzz

C:\>perl -e "print(join(',', map{chomp; $_;} <>))" multilines.txt > output.txt

C:\>more output.txt
xxxx,yyyy,zzzz

P/s: Bagi yang tidak biasa atau baru menggunakan Perl, pengguna Windows OS kena install penterjemah Perl dahulu (Unix dan Linux sudah ada versi Perl yang dipasang).


[ Kemaskini: 19 Okt 2012 ]

Semua perkataan 'Perl-liner' diubah. Istilah yang sebenar ialah 'Perl one-liner'.


No comments:

Post a Comment