One-liner

Opsi -e, -n, -p, dan -i untuk menjalankan Perl dari command line serta penyuntingan berkas di tempat.

Daftar isi

Topik ini membahas penggunaan Perl langsung dari command line tanpa membuat berkas skrip terlebih dahulu. Pembahasan mencakup opsi -e untuk program pendek, opsi -n dan -p yang membungkus program dalam perulangan baris demi baris, serta opsi -i untuk menyunting berkas di tempat. Pola penyaringan baris, penghitungan, dan penggantian teks dibahas melalui contoh yang seluruhnya dapat diulang pada terminal. Setelah topik ini diikuti, tugas pengolahan teks yang kecil dapat diselesaikan dengan satu baris perintah.

Opsi -e untuk program pendek#

Opsi -e memberi tahu perl bahwa program yang akan dijalankan berupa teks yang ditulis langsung pada command line, bukan berkas skrip. Tanpa opsi ini, perl menafsirkan argumen pertama sebagai nama berkas yang berisi program. Program pada -e diapit tanda kutip dan dijalankan sekali dari awal sampai akhir, tanpa perulangan apa pun. Bentuk ini cocok untuk perhitungan pendek dan pemeriksaan cepat yang belum layak disimpan sebagai berkas skrip.

bash
# program kecil dijalankan langsung dari command line
perl -e 'print "Konversi 25 C = ", 25 * 9 / 5 + 32, " F\n"'
text Keluaran
Konversi 25 C = 77 F

Tanda kutip tunggal dipilih karena shell menyerahkan isinya kepada perl tanpa perubahan. Apabila program dibungkus tanda kutip ganda, shell lebih dahulu menginterpolasi setiap tanda $ di dalamnya, sehingga variabel Perl dapat hilang sebelum programnya dijalankan. Aturan yang sama berlaku pada seluruh contoh topik ini, yaitu program diapit tanda kutip tunggal, sedangkan string di dalam program menggunakan tanda kutip ganda. Program yang memuat tanda kutip tunggal tetap dapat ditulis dengan cara tertentu, tetapi begitu programnya terasa panjang, pemindahan ke berkas skrip adalah pilihan yang lebih mudah dirawat.

Membungkus perulangan baris dengan -n dan -p#

Opsi -n dan -p mengubah satu ekspresi pendek menjadi program pengolah berkas baris demi baris. Opsi -n membungkus program dari -e ke dalam perulangan while (<>), sehingga setiap putaran membaca satu baris dari berkas yang disebutkan pada command line. Baris yang sedang diproses tersimpan di variabel khusus $_, sedangkan opsi -n sendiri tidak mencetak apa pun. Opsi -p menggunakan perulangan yang sama, tetapi menambahkan print di akhir setiap putaran, sehingga setiap baris otomatis ditulis ke keluaran standar. Dua padanan berikut memperlihatkan kerangka yang dibentuk kedua opsi tersebut, dengan program dari -e ditempelkan pada posisi komentar.

perl Padanan perulangan yang dibentuk opsi -n
# tidak-dijalankan
LINE: while (<>) {
    # program dari -e ditempel di sini
}
perl Padanan perulangan yang dibentuk opsi -p
# tidak-dijalankan
LINE: while (<>) {
    # program dari -e ditempel di sini
} continue {
    print;
}

Perilaku -p diamati dari perintah dengan program kosong. Yang bekerja hanya print bawaan dari -p, sehingga keluarannya identik dengan perintah cat, yaitu seluruh isi berkas diteruskan apa adanya. Opsi -p baru terasa berguna ketika program di tengahnya mengubah $_, sebagaimana ditunjukkan pada bagian penyuntingan di tempat. Berkas masukan ditulis setelah program, dan beberapa nama berkas boleh diberikan sekaligus untuk diproses berurutan.

bash
# membuat berkas catatan piket
cat > piket.txt <<'EOF'
Senin Ali menyapu
Senin Budi membawa sampah
Selasa Citra menyapu
Selasa Dewi merapikan meja
Rabu Ali merapikan meja
EOF
# -p mencetak setiap baris secara otomatis
perl -pe '' piket.txt
text Keluaran
Senin Ali menyapu
Senin Budi membawa sampah
Selasa Citra menyapu
Selasa Dewi merapikan meja
Rabu Ali merapikan meja

Opsi -n dipadukan dengan print bersyarat untuk menyaring baris. Perulangannya membaca setiap baris, kemudian pernyataan print hanya dijalankan apabila pola menyapu ditemukan pada baris itu. Bentuk penyaringan inilah padanan Perl untuk pekerjaan yang lazim dikerjakan perintah grep. Karena keluaran hanya memuat baris yang cocok, one-liner semacam ini sering digunakan sebagai saringan cepat pada aliran log.

bash
# membuat ulang berkas catatan piket
cat > piket.txt <<'EOF'
Senin Ali menyapu
Senin Budi membawa sampah
Selasa Citra menyapu
Selasa Dewi merapikan meja
Rabu Ali merapikan meja
EOF
# -n mencetak hanya baris yang cocok dengan pola
perl -ne 'print "piket sapu: $_" if /menyapu/' piket.txt
text Keluaran
piket sapu: Senin Ali menyapu
piket sapu: Selasa Citra menyapu

Menghitung baris dengan penghitung dan END#

Variabel yang dideklarasikan di dalam program -e bertahan sepanjang perulangan, sehingga dapat digunakan sebagai penghitung. Setiap baris yang cocok dengan pola menambah nilai $jumlah satu angka, sedangkan blok END dijalankan satu kali setelah seluruh baris habis dibaca. Pola penghitungan semacam ini menempatkan akumulasi di badan perulangan dan pelaporannya di blok END. Variabel $. juga tersedia tanpa deklarasi, karena isinya adalah nomor baris terakhir yang dibaca oleh operator <>.

Program pada -e secara bawaan dijalankan tanpa use strict, sehingga variabel penghitung digunakan tanpa deklarasi my. Nilai awal $jumlah belum terisi, tetapi operator ++ memperlakukannya sebagai nol, sehingga akumulasi dimulai dari angka yang benar. Ketiadaan use warnings membuat kenaikan pertama tersebut berjalan tanpa peringatan apa pun. Opsi -Mstrict tetap tersedia apabila disiplin deklarasi variabel diinginkan pada one-liner.

bash
# membuat ulang berkas catatan piket
cat > piket.txt <<'EOF'
Senin Ali menyapu
Senin Budi membawa sampah
Selasa Citra menyapu
Selasa Dewi merapikan meja
Rabu Ali merapikan meja
EOF
# menghitung baris yang memuat kata menyapu
perl -ne '$jumlah++ if /menyapu/; END { print "Baris menyapu: $jumlah\n" }' piket.txt
# menghitung seluruh baris dengan variabel $.
perl -ne 'END { print "Total baris: $.\n" }' piket.txt
text Keluaran
Baris menyapu: 2
Total baris: 5

Dua perintah pada blok di atas masing-masing menjalankan perulangan tersendiri atas berkas yang sama. Perintah pertama menghitung baris yang memuat kata tertentu, sedangkan perintah kedua melaporkan total baris melalui $. yang dibaca di dalam blok END. Langkah selanjutnya mengubah isi baris itu sendiri, bukan sekadar menghitungnya, dan hasil perubahannya ditulis kembali ke berkas.

Penyuntingan di tempat dengan -i#

Penggantian teks pada seluruh baris dilakukan dengan -p dan operator substitusi s///. Perintah berikut mengganti awalan Senin pada setiap baris, tetapi berkas aslinya tetap utuh karena keluaran substitusi hanya dikirim ke layar. Menguji pola penggantian dalam bentuk ini adalah kebiasaan yang aman sebelum berkasnya benar-benar disunting.

bash
# membuat ulang berkas catatan piket
cat > piket.txt <<'EOF'
Senin Ali menyapu
Senin Budi membawa sampah
Selasa Citra menyapu
Selasa Dewi merapikan meja
Rabu Ali merapikan meja
EOF
# -pe mengganti teks pada setiap baris, hasilnya ke layar
perl -pe 's/^Senin/SENIN/' piket.txt
text Keluaran
SENIN Ali menyapu
SENIN Budi membawa sampah
Selasa Citra menyapu
Selasa Dewi merapikan meja
Rabu Ali merapikan meja

Agar hasil penggantian ditulis kembali ke berkas yang sama, opsi -i mengubah arah print dari -p ke berkas masukannya. Perl membentuk berkas keluaran baru yang menggantikan berkas masukan, sehingga setiap baris yang dicetak -p ditulis ke berkas dengan nama yang sama. Dengan ekstensi cadangan seperti -i.bak, berkas asli dipindahkan menjadi berkas cadangan sebelum berkas baru ditulis, sehingga hasil penyuntingan masih dapat diperiksa atau dikembalikan.

bash
# membuat berkas jadwal gerbang
cat > jadwal.txt <<'EOF'
Pukul 07.00 buka gerbang
Pukul 12.00 tutup sementara
Pukul 17.00 tutup gerbang
EOF
# -i.bak menyunting berkas di tempat dan menyimpan cadangan
perl -i.bak -pe 's/tutup gerbang/kunci gerbang/' jadwal.txt
cat jadwal.txt
echo '--- isi berkas cadangan ---'
cat jadwal.txt.bak
text Keluaran
Pukul 07.00 buka gerbang
Pukul 12.00 tutup sementara
Pukul 17.00 kunci gerbang
--- isi berkas cadangan ---
Pukul 07.00 buka gerbang
Pukul 12.00 tutup sementara
Pukul 17.00 tutup gerbang

Berkas jadwal.txt kini memuat baris yang telah diganti, sedangkan jadwal.txt.bak memuat isi sebelum penyuntingan. Apabila hasilnya tidak sesuai harapan, berkas cadangan cukup dikembalikan dengan perintah mv. Kebiasaan menyertakan ekstensi cadangan melindungi data ketika pola penggantiannya keliru.

Kesalahan umum#

Tiga kesalahan berikut paling sering muncul ketika one-liner pertama kali dipraktikkan pada terminal.

  1. Program -e dibungkus tanda kutip ganda, sehingga shell menginterpolasi tanda $ di dalamnya sebelum perl menerima programnya. Gejalanya berupa perintah yang menghasilkan teks kosong atau program yang berubah isinya. Perbaikannya adalah membungkus program dengan tanda kutip tunggal dan menyimpan tanda kutip ganda hanya untuk string di dalam program.
  2. Opsi -n dijalankan tanpa pernyataan print, sehingga perintah berakhir tanpa keluaran apa pun. Perulangannya memang berjalan, tetapi tidak ada bagian yang mencetak barisnya. Tambahkan print bersyarat atau ganti -n dengan -p apabila seluruh baris perlu dicetak kembali.
  3. Opsi -i dijalankan tanpa ekstensi cadangan pada satu-satunya salinan berkas, sehingga isi lama hilang ketika pola penggantiannya ternyata keliru. Pulihkan dari salinan lain bila masih ada, lalu biasakan menguji pola dengan -pe serta menyertakan -i.bak pada penyuntingan sesungguhnya.

Ringkasan#

  • Opsi -e menjalankan teks program yang ditulis langsung pada command line, sekali penuh tanpa perulangan baris.
  • Opsi -n membungkus program dalam perulangan while (<>), sedangkan -p menambahkan print otomatis di akhir setiap putaran.
  • Kombinasi -ne dengan print bersyarat menyaring baris, dan blok END melaporkan hasil akumulasi setelah seluruh baris selesai dibaca.
  • Opsi -i menulis hasil pengolahan kembali ke berkas masukan, dan -i.bak menyimpan cadangan berkas asli sebelum penyuntingan.

Referensi#