Apa saja fitur bahasa esoterik yang benar-benar bermanfaat di Perl yang sebenarnya bisa Anda gunakan untuk melakukan pekerjaan yang bermanfaat?
Pedoman:
- Cobalah untuk membatasi jawaban pada inti Perl dan bukan CPAN
- Tolong beri contoh dan deskripsi singkat
Fitur Tersembunyi juga ditemukan di Fitur Tersembunyi bahasa lain:
(Ini semua dari jawaban Corion )
- C
- Perangkat Duff
- Portabilitas dan Standar
- C #
- Kutipan untuk daftar dan string yang dibatasi whitespace
- Ruang nama yang dapat diubah
- Jawa
- Peminat Statis
- JavaScript
- Fungsinya adalah warga negara kelas satu
- Blokir ruang lingkup dan penutupan
- Metode panggilan dan accessor secara tidak langsung melalui variabel
- Rubi
- Menentukan metode melalui kode
- PHP
- Baca dokumentasi online
- Metode ajaib
- Referensi simbolik
- Python
- Pertukaran nilai satu baris
- Kemampuan untuk mengganti fungsi inti dengan fungsi Anda sendiri
Fitur Tersembunyi Lainnya:
Operator:
- Operator kuasi bool
- Operator flip-flop
- Juga digunakan untuk konstruksi daftar
- Operator
++
dan unary-
bekerja pada string - Operator pengulangan
- Operator pesawat ruang angkasa
- The || operator (dan // operator) untuk memilih dari serangkaian pilihan
- Operator berlian
- Kasus khusus dari
m//
operator - "Operator" tilde-tilde
Mengutip konstruk:
- Operator qw
- Surat dapat digunakan sebagai pembatas kutipan dalam konstruksi q {} - seperti
- Mekanisme mengutip
Sintaks dan Nama:
- Mungkin ada ruang setelah sigil
- Anda dapat memberikan nama numerik subs dengan referensi simbolik
- Koma jejak hukum
- Literal Integer yang Dikelompokkan
- irisan hash
- Mengisi kunci hash dari sebuah array
Modul, Pragma, dan opsi baris perintah:
- gunakan peringatan ketat dan gunakan
- Pemeriksaan noda
- Penggunaan esoterik -n dan -p
- CPAN
overload::constant
- IO :: Menangani modul
- Kompartemen aman
- Atribut
Variabel:
Kontrol loop dan aliran:
Ekspresi reguler:
Fitur lainnya:
- Debugger
- Blok kode khusus seperti BEGIN, CHECK, dan END
- The
DATA
blok - Operasi Blok Baru
- Filter Sumber
- Pengait Sinyal
- peta ( dua kali )
- Membungkus fungsi bawaan
- The
eof
fungsi - The
dbmopen
fungsi - Mengubah peringatan menjadi kesalahan
Trik lain, dan meta-jawaban:
Lihat juga:
perl
hidden-features
Adam Bellaire
sumber
sumber
Jawaban:
Operator flip-flop berguna untuk melewatkan iterasi pertama ketika mengulangi catatan (biasanya baris) yang dikembalikan oleh file handle, tanpa menggunakan variabel flag:
Jalankan
perldoc perlop
dan cari "flip-flop" untuk informasi dan contoh lebih lanjut.sumber
Ada banyak fitur yang tidak jelas di Perl.
Misalnya, apakah Anda tahu bahwa ada ruang setelah sigil?
Atau Anda dapat memberikan nama numerik subs jika Anda menggunakan referensi simbolik?
Ada juga operator kuasi "bool", yang mengembalikan 1 untuk ekspresi benar dan string kosong untuk false:
Hal menarik lainnya: dengan
use overload
Anda dapat membebani string literal dan angka (dan misalnya membuatnya BigInts atau apa pun).Banyak dari hal-hal ini sebenarnya didokumentasikan di suatu tempat, atau mengikuti secara logis dari fitur-fitur yang didokumentasikan, tetapi beberapa tidak diketahui.
Perbarui : Satu lagi yang bagus. Di bawah
q{...}
konstruk penawaran disebutkan, tetapi apakah Anda tahu bahwa Anda dapat menggunakan huruf sebagai pembatas?Anda juga dapat menulis ekspresi reguler:
sumber
Tambahkan dukungan untuk file terkompresi melalui ARGV ajaib :
(kutipan sekitar $ _ diperlukan untuk menangani nama file dengan karakter meta shell di)
Sekarang
<>
fitur tersebut akan mendekompres semua@ARGV
file yang diakhiri dengan ".gz" atau ".Z":sumber
|
dari penggantian.zcat |
diuraikan sebagai perintah untuk pipa melalui?@ARGV
Salah satu fitur favorit saya di Perl adalah menggunakan
||
operator boolean untuk memilih di antara serangkaian pilihan.Ini berarti seseorang dapat menulis:
untuk mengambil nilai sebenarnya pertama dari
$a
,$b
, dan$c
, atau default0
sebaliknya.Di Perl 5.10, ada juga
//
operator, yang mengembalikan sisi kiri jika sudah ditentukan, dan sisi kanan sebaliknya. Yang ditunjuk mengikuti pertama didefinisikan nilai dari$a
,$b
,$c
, atau0
sebaliknya:Ini juga dapat digunakan dengan form tangan pendeknya, yang sangat berguna untuk menyediakan default:
Cheerio,
Paul
sumber
Operator ++ dan unary - tidak hanya bekerja pada angka, tetapi juga pada string.
cetakan -a
cetakan b
mencetak aa
sumber
--
tidak berfungsi pada string.ord()
. Atau, tulis kelas kecil dan membebani operator untuk melakukannya untuk Anda.Karena Perl memiliki hampir semua bagian "esoterik" dari daftar lain, saya akan memberi tahu Anda satu hal yang tidak dapat Perl:
Satu hal yang Perl tidak dapat lakukan adalah memiliki URL sewenang-wenang dalam kode Anda, karena//
operator digunakan untuk ekspresi reguler.Untuk berjaga-jaga kalau tidak jelas bagi Anda fitur apa yang ditawarkan Perl, berikut adalah daftar pilihan entri yang mungkin tidak sepenuhnya jelas:
Perangkat Duff - dalam Perl
Portabilitas dan Standar - Kemungkinan ada lebih banyak komputer dengan Perl daripada dengan kompiler C
Kelas manipulasi file / jalur - File :: Find berfungsi bahkan pada sistem operasi yang lebih banyak daripada .Net
Kutipan untuk daftar dan string yang dibatasi whitespace - Perl memungkinkan Anda untuk memilih kutipan yang hampir sewenang-wenang untuk daftar Anda dan pembatas string
Ruang nama yang dapat diubah - Perl memiliki ini melalui penugasan glob:
Inisialisasi statis - Perl dapat menjalankan kode di hampir setiap fase kompilasi dan instantiasi objek, dari
BEGIN
(parse kode) keCHECK
(setelah parse kode) keimport
(pada impor modul) kenew
(instantiasi objek) keDESTROY
(objek penghancuran) keEND
( penghancuran objek) ke (keluar dari program)Fungsinya adalah warga negara kelas satu - seperti di Perl
Blok cakupan dan penutupan - Perl memiliki keduanya
Metode panggilan dan accessor secara tidak langsung melalui variabel - Perl juga melakukannya:
Mendefinisikan metode melalui kode - Perl juga memungkinkan :
Dokumentasi pervasive online - Dokumentasi Perl online dan mungkin juga ada di sistem Anda
Metode ajaib yang dipanggil setiap kali Anda memanggil fungsi "tidak ada" - Perl mengimplementasikannya dalam fungsi AUTOLOAD
Referensi simbolik - Anda disarankan untuk menjauh dari ini. Mereka akan memakan anak-anakmu. Tapi tentu saja, Perl memungkinkan Anda untuk menawarkan anak-anak Anda kepada iblis yang haus darah.
Swapping nilai satu garis - Perl memungkinkan penugasan daftar
Kemampuan untuk mengganti fungsi inti dengan fungsi Anda sendiri
atau
sumber
Autovivification . AFAIK tidak ada bahasa lain yang memilikinya .
sumber
Sangat mudah untuk mengutip hampir semua jenis string aneh di Perl.
Faktanya, berbagai mekanisme penawaran dalam Perl cukup menarik. Mekanisme mengutip seperti regex Perl memungkinkan Anda untuk mengutip sesuatu, menentukan pembatas. Anda dapat menggunakan hampir semua karakter khusus seperti #, /, atau membuka / menutup karakter seperti (), [], atau {}. Contoh:
Mekanisme mengutip:
q: kutipan literal; hanya karakter yang perlu melarikan diri adalah karakter akhir. qq: kutipan yang ditafsirkan; memproses variabel dan melarikan diri karakter. Bagus untuk string yang perlu Anda kutip:
qx: Bekerja seperti qq, tetapi kemudian menjalankannya sebagai perintah sistem, non-interaktif. Mengembalikan semua teks yang dihasilkan dari standar keluar. (Redirection, jika didukung dalam OS, juga keluar) Juga dilakukan dengan tanda kutip kembali (karakter `).
qr: Mengartikan seperti qq, tetapi kemudian mengkompilasinya sebagai ekspresi reguler. Bekerja dengan berbagai opsi pada regex juga. Anda sekarang dapat melewatkan regex sebagai variabel:
qw: Operator penawaran yang sangat berguna. Mengubah seperangkat kata yang dikutip dari spasi putih yang dikutip menjadi daftar. Sangat bagus untuk mengisi data dalam unit test.
Mereka bagus untuk menggunakannya kapan pun hal itu membuat lebih jelas. Untuk qx, qq, dan q, kemungkinan besar saya menggunakan operator {}. Kebiasaan paling umum orang menggunakan qw biasanya operator (), tetapi kadang-kadang Anda juga melihat qw //.
sumber
my $moreout = qx{type "$path" 2>&1};
... Aku tidak tahu kamu bisa melakukan itu! [TM]Tidak benar-benar tersembunyi, tetapi banyak programmer setiap hari Perl tidak tahu tentang CPAN . Ini terutama berlaku untuk orang-orang yang bukan pemrogram penuh waktu atau tidak memprogram dalam waktu penuh Perl.
sumber
Pernyataan "untuk" dapat digunakan dengan cara yang sama "dengan" digunakan dalam Pascal:
Anda dapat menerapkan urutan operasi s / / /, dll untuk variabel yang sama tanpa harus mengulangi nama variabel.
CATATAN: ruang tanpa putus di atas (& nbsp;) telah menyembunyikan Unicode di dalamnya untuk menghindari penurunan harga. Jangan menyalinnya :)
sumber
Operator kata sandi adalah salah satu hal favorit saya. Membandingkan:
dan
Jauh lebih sedikit noise, lebih mudah pada mata. Hal lain yang sangat bagus tentang Perl, yang sangat dirindukan ketika menulis SQL, adalah bahwa tanda koma adalah sah:
Itu terlihat aneh, tetapi tidak jika Anda indentasi kode dengan cara lain:
Menambahkan argumen tambahan ke pemanggilan fungsi tidak mengharuskan Anda untuk mengutak-atik koma pada garis sebelumnya atau garis akhir. Perubahan garis tunggal tidak berdampak pada garis sekitarnya.
Ini membuatnya sangat menyenangkan untuk bekerja dengan fungsi variadic. Ini mungkin salah satu fitur Perl yang paling rendah.
sumber
for (<a list of stuff>) { ... }
Kemampuan untuk mem-parsing data yang langsung disisipkan ke dalam blok DATA . Tidak perlu menyimpan ke file uji untuk dibuka di program atau serupa. Sebagai contoh:
sumber
Operasi Blok Baru
Saya akan mengatakan kemampuan untuk memperluas bahasa, membuat operasi pseudo block adalah satu.
Anda mendeklarasikan prototipe untuk sub yang menunjukkan bahwa dibutuhkan referensi kode terlebih dahulu:
Anda kemudian dapat menyebutnya di dalam tubuh seperti itu
(
Data::Dumper::Dumper
adalah permata semi-tersembunyi.) Perhatikan bagaimana Anda tidak memerlukannyasub
kata kunci di depan blok, atau koma sebelum hash. Itu akhirnya tampak seperti:map { } @list
Filter Sumber
Juga, ada filter sumber. Di mana Perl akan memberikan Anda kode sehingga Anda dapat memanipulasinya. Baik ini, dan operasi blok, cukup banyak jangan-coba-ini-di rumah.
Saya telah melakukan beberapa hal yang rapi dengan filter sumber, misalnya seperti membuat bahasa yang sangat sederhana untuk memeriksa waktu, memungkinkan Perl satu kalimat pendek untuk beberapa pengambilan keputusan:
Lib::TL
hanya akan memindai "variabel" dan konstanta, membuat mereka dan menggantikannya sesuai kebutuhan.Sekali lagi, filter sumber bisa berantakan, tetapi sangat kuat. Tetapi mereka dapat mengacaukan hal-hal buruk - dan bahkan peringatan dapat dicetak dengan nomor baris yang salah. Saya berhenti menggunakan Damian's Switch karena debugger akan kehilangan semua kemampuan untuk memberi tahu saya di mana saya sebenarnya. Tetapi saya telah menemukan bahwa Anda dapat meminimalkan kerusakan dengan memodifikasi bagian kecil kode, menjaganya tetap pada baris yang sama.
Pengait Sinyal
Sudah cukup sering dilakukan, tetapi tidak begitu jelas. Berikut adalah pawang mati yang mendukung piggy yang lama.
Itu berarti setiap kali modul lain dalam kode ingin mati, mereka harus datang kepada Anda (kecuali orang lain menimpa
$SIG{__DIE__}
). Dan Anda dapat diberitahu bahwa ada sesuatu yang salah pada seseorang.Tentu saja, untuk hal-hal yang cukup Anda hanya dapat menggunakan
END { }
blok, jika semua yang ingin Anda lakukan adalah membersihkan.overload::constant
Anda dapat memeriksa literal jenis tertentu dalam paket yang menyertakan modul Anda. Misalnya, jika Anda menggunakan ini di
import
sub Anda :itu berarti bahwa setiap bilangan bulat lebih besar dari 2 miliar dalam paket panggilan akan diubah menjadi
Math::BigInt
objek. (Lihat kelebihan :: konstan ).Literal Integer yang Dikelompokkan
Sementara kita melakukannya. Perl memungkinkan Anda untuk memecah sejumlah besar menjadi kelompok tiga digit dan masih mendapatkan integer parsable dari itu. Catatan di
2_000_000_000
atas untuk 2 miliar.sumber
->slice
sebagai metode setiap kali diperlukan irisan.Biner "x" adalah operator pengulangan :
Ini juga berfungsi dengan daftar:
sumber
Pemeriksaan noda. Dengan pemeriksaan noda diaktifkan, perl akan mati (atau memperingatkan, dengan
-t
) jika Anda mencoba meneruskan data tercemar (secara kasar, data dari luar program) ke fungsi yang tidak aman (membuka file, menjalankan perintah eksternal, dll.). Sangat membantu ketika menulis skrip setuid atau CGI atau apa pun di mana skrip memiliki hak istimewa yang lebih besar daripada orang yang memberinya data.Goto ajaib.
goto &sub
melakukan panggilan ekor yang dioptimalkan.Debugger.
use strict
danuse warnings
. Ini dapat menyelamatkan Anda dari banyak kesalahan ketik.sumber
Berdasarkan cara
"-n"
dan"-p"
sakelar diimplementasikan di Perl 5, Anda dapat menulis program yang tampaknya salah termasuk}{
:yang dikonversi secara internal ke kode ini:
sumber
Mari kita mulai dengan Operator Ruang Angkasa .
sumber
($a->lname cmp $b->lname) || ($a->fname cmp $b->fname)
macam orang dengan nama belakang mereka, tetapi jika dua orang memiliki nama belakang yang sama maka mereka akan dipesan dengan nama depan mereka.Ini adalah meta-jawaban, tetapi arsip Perl Tips berisi segala macam trik menarik yang dapat dilakukan dengan Perl. Arsip tips sebelumnya adalah online untuk browsing, dan dapat berlangganan melalui milis atau feed atom.
Beberapa tips favorit saya termasuk membangun executables dengan PAR , menggunakan autodie untuk melempar pengecualian secara otomatis , dan penggunaan switch dan konstruksi smart-match di Perl 5.10.
Pengungkapan: Saya adalah salah satu penulis dan pengelola Perl Tips, jadi saya jelas sangat memikirkan mereka. ;)
sumber
map - bukan hanya karena itu membuat kode seseorang lebih ekspresif, tetapi karena itu memberi saya dorongan untuk membaca sedikit lebih banyak tentang "pemrograman fungsional" ini.
sumber
Klausa melanjutkan loop. Ini akan dieksekusi di bagian bawah setiap loop, bahkan yang berikutnya.
sumber
Pilihan saya akan untuk grup (? {}) Dan (?? {}) dalam ekspresi reguler Perl. Yang pertama mengeksekusi kode Perl, mengabaikan nilai kembali, kode mengeksekusi kedua, menggunakan nilai kembali sebagai ekspresi reguler.
sumber
s/(pattern)/reverse($1);/ge;
# membalikkan semuapatterns
.uninames
,unichars
dan terutamauniprops
untuk melihat hanya bagian dari apa yang saya maksud.jangkar \ G. Ini panas .
sumber
The
m//
operator memiliki beberapa kasus khusus jelas:?
sebagai pembatas itu hanya cocok sekali kecuali Anda meneleponreset
.'
sebagai pembatas, polanya tidak diinterpolasi.sumber
Operator berlian filehandle nol
<>
memiliki tempat dalam membangun alat-alat baris perintah. Kerjanya suka<FH>
membaca dari pegangan, kecuali bahwa secara ajaib memilih mana yang ditemukan pertama kali: nama file baris perintah atau STDIN. Diambil dari perlop:sumber
perl myscript.pl file1.txt - file2.txt
, Dan perl akan memproses file pertama, kemudian stdin, maka file kedua.overload
dengan<>
operator pada objek sendiri (<$var>
) bekerja seperti iterator. Namun itu tidak berfungsi seperti yang Anda harapkan dalam konteks daftar.Blok kode khusus seperti
BEGIN
,CHECK
danEND
. Mereka berasal dari Awk, tetapi bekerja secara berbeda di Perl, karena tidak berbasis catatan.The
BEGIN
blok dapat digunakan untuk menentukan beberapa kode untuk tahap parsing; itu juga dieksekusi ketika Anda melakukan sintaks-dan-variabel-cekperl -c
. Misalnya, memuat dalam variabel konfigurasi:sumber
mengganti nama data.txt.part menjadi data.txt tanpa harus mengulang sendiri.
sumber
Agak tidak jelas adalah "operator" tilde-tilde yang memaksa konteks skalar.
sama dengan
dan berbeda dari
sumber
~~
, yang dapat melakukan pencocokan regex, dapat melihat apakah suatu item terkandung dalam array dan sebagainya.dasi, antarmuka ikatan variabel.
sumber
"Mode putus asa" dari konstruksi kontrol loop Perl yang menyebabkan mereka mencari tumpukan untuk menemukan label yang cocok memungkinkan beberapa perilaku aneh yang diuji :: Lebih mengambil manfaat, baik atau buruk.
Ada file .pmc yang sedikit diketahui. "use Foo" akan mencari Foo.pmc di @INC sebelum Foo.pm. Ini dimaksudkan untuk memungkinkan bytecode yang dikompilasi dimuat terlebih dahulu, tetapi Module :: Compile mengambil keuntungan dari ini untuk cache modul yang disaring sumber untuk waktu muat yang lebih cepat dan lebih mudah untuk debugging.
Kemampuan untuk mengubah peringatan menjadi kesalahan.
Itulah yang bisa saya pikirkan dari atas kepala saya yang belum disebutkan.
sumber
Operator kambing
*
:atau
Ini berfungsi karena penugasan daftar dalam konteks skalar menghasilkan jumlah elemen dalam daftar yang ditugaskan.
*
Catatan, bukan benar-benar operatorsumber