Fungsi split dan join bekerja berpasangan dalam dua arah yang berlawanan. Fungsi split memecah satu string menjadi list dengan bantuan pola ekspresi reguler, sedangkan join menyusun elemen list kembali menjadi satu string dengan pemisah tertentu. Keduanya termasuk fungsi inti Perl, sehingga tidak perlu dimuat dari modul apa pun. Topik ini membahas keduanya beserta limit pemecahan, penanganan spasi beruntun, dan kaitan chomp dengan data masukan yang membawa baris barunya. Setelah membaca topik ini, baris data dapat dipecah, diperiksa per kolom, dan disusun kembali menjadi format lain.
Memecah string dengan split#
Fungsi split /pola/, $string memeriksa $string dari kiri ke kanan, dan setiap tempat yang cocok dengan pola menjadi batas pemecahan. Hasilnya berupa list berisi potongan-potongan di antara batas tersebut, sedangkan polanya sendiri tidak ikut tersimpan. Batas diberlakukan satu per satu, sehingga pemisah yang berdiri berdampingan menghasilkan elemen kosong di antara keduanya, kecuali polanya ditulis untuk menampung pengulangan seperti /\s+/. Skrip berikut memecah baris data yang dipisahkan tanda titik dua:
#!/usr/bin/env perl
use strict;
use warnings;
my $baris = "Ali:Budi:Citra:Dewi";
# split memecah string menjadi list berdasarkan pola
my @nama = split /:/, $baris;
foreach my $n (@nama) {
print "$n\n";
}Ali
Budi
Citra
DewiTiga tanda titik dua menghasilkan empat potongan, dan setiap potongan menjadi satu elemen @nama. Pemecahnya berupa pola, sehingga argumen pertama split boleh memuat metakarakter apa pun, misalnya \s, [,:], atau alternasi. Karakter pemisah yang ditulis sebagai string biasa seperti ":" juga diterima, tetapi penulisan pola /:/ menjadi kebiasaan yang konsisten dengan sisa modul ini.
Tanpa argumen kedua, split /:/ memeriksa variabel default $_, sehingga bentuk terpendeknya muncul di dalam perulangan. Argumen pola juga boleh berupa pola kosong //, yang memecah string menjadi karakter-karakter penyusunnya, misalnya "abc" menjadi a, b, dan c. Bentuk ini berguna untuk menghitung karakter, meskipun pemakaiannya lebih jarang daripada pemecah berbasis pemisah.
Spasi beruntun dan limit#
Data yang diketik manusia sering memuat jarak spasi yang tidak seragam, sehingga pola /\s+/ menjadi pemecah yang paling sering digunakan karena menanggung satu spasi atau lebih sekaligus. Argumen ketiga split yang bersifat opsional berupa limit, yaitu batas maksimal banyaknya potongan, sehingga sisa string tidak ikut terpecah. Skrip berikut menggunakan keduanya:
#!/usr/bin/env perl
use strict;
use warnings;
my $catatan = "piket Senin ruang 204";
# /\s+/ menangani satu spasi atau lebih sekaligus
my @kata = split /\s+/, $catatan;
print scalar(@kata), " kata: @kata\n";
# limit membatasi banyaknya hasil pemecahan
my @bagian = split /\s+/, $catatan, 2;
print "Bagian 1: $bagian[0]\n";
print "Bagian 2: $bagian[1]\n";4 kata: piket Senin ruang 204
Bagian 1: piket
Bagian 2: Senin ruang 204Pola /\s+/ menghasilkan empat kata yang bersih tanpa satu pun spasi ganda tersisa. Dengan limit 2, pemecahan berhenti setelah potongan kedua terbentuk, sehingga Bagian 2 masih memuat sisa string utuh lengkap dengan spasi beruntunnya. Limit berguna untuk memisahkan kata kunci dari sisanya, misalnya mengambil kolom pertama sebagai label dan sisanya sebagai isian bebas.
Kelas \s pada pola itu menanggung spasi, tab, dan baris baru sekaligus, sehingga baris yang memuat ketiganya tetap terpecah rapi. Perilaku lain yang perlu diketahui ada pada pemisah di ujung string, yaitu pemecahan default tidak menghasilkan elemen kosong di akhir untuk pemisah yang menempel di ujung. Perilaku detail seperti ini jarang berpengaruh pada data yang sudah bersih, tetapi penting diketahui saat data mentah mulai diproses.
chomp sebelum memecah#
Baris yang dibaca dari berkas atau masukan standar selalu membawa karakter baris baru di ujungnya, dan karakter itu menempel pada elemen terakhir hasil split. Fungsi chomp membuang baris baru tersebut, dan pemanggilannya sebelum split menjadi urutan kerja yang lazim. Urutan ini terlihat sepele, tetapi melupakannya membuat elemen terakhir tidak cocok saat dibandingkan dengan nilai yang diharapkan, karena nilai\n tidak sama dengan nilai. Skrip berikut membandingkan hasil pemecahan dengan dan tanpa chomp:
#!/usr/bin/env perl
use strict;
use warnings;
my $baris = "10, 20, 30, 40\n";
# tanpa chomp, baris baru menempel pada elemen terakhir
my @mentah = split /,\s*/, $baris;
print "Mentah: [@mentah]\n";
# chomp membuang baris baru sebelum string dipecah
chomp $baris;
my @angka = split /,\s*/, $baris;
print "Bersih: [@angka]\n";
my $total = 0;
$total += $_ foreach @angka;
print "Total : $total\n";Mentah: [10 20 30 40
]
Bersih: [10 20 30 40]
Total : 100Tanda kurung pada keluaran memperlihatkan penutup yang jatuh ke baris kedua, karena elemen terakhir hasil pemecahan memuat \n. Setelah chomp, elemen terakhir bersih dan nilai-nilainya dapat dijumlahkan tanpa perlakuan khusus. Pola /,\s*/ menanggung koma dengan atau tanpa spasi setelahnya, sehingga format 10,20 dan 10, 20 diperlakukan sama.
Urutan chomp lalu split menjadi idiom yang muncul hampir di setiap program pembaca berkas, karena baris masukan hampir selalu membawa \n. Apabila chomp terlupa, gejalanya samar, yaitu elemen terakhir tampak benar di layar tetapi perbandingan stringnya gagal karena ada karakter tersembunyi. Karena itu memeriksa keluaran dengan pembatas seperti tanda kurung pada skrip di atas menjadi kebiasaan yang menghemat waktu pencarian error.
Menyusun string dengan join#
Fungsi join PEMISAH, LIST menyusun seluruh elemen list menjadi satu string, dengan PEMISAH diselipkan di antara setiap dua elemen bertetangga. Pemisah tidak pernah muncul di awal atau akhir hasil, dan pemisah kosong "" menyambung elemen tanpa jarak sama sekali. Skrip berikut menyusun nilai ujian menjadi satu baris, lalu mengganti pemisah sebuah baris data:
#!/usr/bin/env perl
use strict;
use warnings;
my @nilai = (90, 85, 78);
# join menyusun elemen list menjadi satu string dengan pemisah
my $gabung = join(" - ", @nilai);
print "Rapor: $gabung\n";
# split dan join berpasangan mengganti pemisah
my $baris = "Ali:Budi:Citra";
my @nama = split /:/, $baris;
my $csv = join(",", @nama);
print "CSV : $csv\n";Rapor: 90 - 85 - 78
CSV : Ali,Budi,CitraPasangan split lalu join pada bagian kedua mengubah pemisah titik dua menjadi koma, dan pola kerja ini menjadi cara baku untuk menata ulang baris data. Arah kerjanya selalu dua langkah, yaitu split menghasilkan list yang mudah diperiksa atau diubah, kemudian join membungkusnya kembali menjadi string siap ditulis.
Fungsi join tidak memproses isinya sama sekali, karena elemen list dikonversi menjadi string lalu disambung tanpa perlakuan tambahan. Urutan argumennya juga perlu diingat, yaitu pemisah lebih dahulu dan list di belakangnya, berkebalikan dengan split yang menempatkan pola lebih dahulu. Argumen pemisah boleh berupa string sepanjang apa pun, termasuk beberapa karakter sekaligus seperti " | " atau baris baru. Bila elemen list perlu diformat terlebih dahulu, pemformatan dilakukan sebelum join, misalnya melalui perulangan biasa, sehingga fungsi ini tetap berperan sebagai langkah terakhir penyusunan.
Ringkasan#
split /pola/, $stringmemecah string pada setiap kecocokan pola dan menghasilkan list potongan tanpa pemisahnya.- Pola
/\s+/menangani spasi beruntun, sedangkan argumen limit membatasi banyaknya potongan agar sisa string tetap utuh. chompmembuang baris baru sebelum pemecahan, karena karakter itu menempel pada elemen terakhir hasilsplit.join PEMISAH, LISTmenyusun list menjadi string dengan pemisah di antara elemen, dan pasangansplitdenganjoinmenjadi cara baku mengganti pemisah sebuah baris data.
Referensi#
- perlfunc — Perl documentation
— Dokumentasi resmi fungsi
split,join, danchompyang digunakan seluruh contoh. - perlretut — Perl documentation
— Tutorial resmi yang menyertakan
splitsebagai penerapan pola ekspresi reguler. - perldata — Perl documentation — Referensi perilaku list dan interpolasi array yang menopang keluaran contoh.