Menurut saya, banyak pertanyaan di tag Perl dapat diselesaikan jika orang akan menggunakan:
use strict;
use warnings;
Saya pikir beberapa orang menganggap ini mirip dengan roda pelatihan, atau komplikasi yang tidak perlu, yang jelas tidak benar, karena bahkan pemrogram Perl yang sangat terampil menggunakannya.
Tampaknya sebagian besar orang yang mahir dalam Perl selalu menggunakan kedua pragma ini, sedangkan mereka yang paling diuntungkan dengan menggunakannya jarang melakukannya. Jadi, saya pikir akan menjadi ide yang bagus untuk memiliki pertanyaan untuk ditautkan saat mendorong orang untuk use strict
dan warnings
.
Jadi, mengapa harus menjadi pengembang Perl use strict
dan warnings
?
use loose;
use strict
itu ide yang bagus tetapi kompatibilitas mundur telah menjadi masalah nyata bagi Anda :-(use strict;
aktif secara default saat Anda meminta bahasa Perl 5.12 (atau lebih tinggi). Cobaperl -e"use v5.012; $x=123;"
.no strict;
sebenarnya mematikannya.Jawaban:
Sebagai permulaan,
use strict;
(dan pada tingkat yang lebih rendah,use warnings;
) membantu menemukan kesalahan ketik dalam nama variabel. Bahkan programmer berpengalaman membuat kesalahan seperti itu. Kasus yang umum terjadi adalah lupa mengganti nama instance variabel saat membersihkan atau memfaktorkan ulang kode.Menggunakan
use strict; use warnings;
menangkap banyak kesalahan lebih cepat daripada tertangkap sebaliknya, yang membuatnya lebih mudah untuk menemukan akar penyebab kesalahan. Akar penyebabnya mungkin kebutuhan akan kesalahan atau pemeriksaan validasi, dan itu bisa terjadi terlepas dari keahlian programmer.Apa yang baik tentang peringatan Perl adalah bahwa mereka jarang palsu, jadi tidak ada biaya untuk menggunakannya.
Bacaan terkait: Mengapa digunakan
my
?sumber
use strict;
diaktifkan secara default jika Anda menggunakan versi 5.12 atau yang lebih baru dari bahasa (use 5.012;
).Rupanya
use strict
harus (harus) digunakan ketika Anda ingin memaksa perl ke kode dengan benar yang dapat memaksa deklarasi, menjadi eksplisit pada string dan sub yaitu bareword atau menggunakan ref dengan hati-hati. Catatan: jika ada kesalahan penggunaan ketat akan membatalkan eksekusi jika digunakan.Sementara
use warnings;
akan membantu Anda menemukan kesalahan pengetikan dalam program seperti Anda melewatkan titik koma, Anda menggunakan 'elseif' dan bukan 'elsif', Anda menggunakan sintaks atau fungsi yang tidak digunakan lagi, apapun seperti itu. Catatan: gunakan peringatan hanya akan memberikan peringatan dan melanjutkan eksekusi yaitu tidak akan membatalkan eksekusi ..Bagaimanapun, akan lebih baik jika kita membahas detailnya, yang saya sebutkan di bawah ini
Dari perl.com (favorit saya):
gunakan 'vars' yang ketat;
yang berarti Anda harus selalu mendeklarasikan variabel sebelum Anda menggunakannya.
Jika Anda tidak mendeklarasikan, Anda mungkin akan mendapatkan pesan kesalahan untuk variabel yang tidak dideklarasikan
Peringatan ini berarti Perl tidak terlalu jelas tentang apa ruang lingkup variabel itu. Jadi, Anda perlu eksplisit tentang variabel Anda, yang berarti mendeklarasikannya dengan
my
sehingga dibatasi ke blok saat ini, atau merujuknya dengan nama yang sepenuhnya memenuhi syarat (misalnya: $ MAIN :: variablename).Jadi, kesalahan waktu kompilasi dipicu jika Anda mencoba mengakses variabel yang belum memenuhi setidaknya satu dari kriteria berikut:
Ditentukan sebelumnya oleh Perl itu sendiri, seperti @ARGV,% ENV, dan semua variabel tanda baca global seperti $. atau $ _.
Dinyatakan dengan kami (untuk global) atau saya (untuk leksikal).
Diimpor dari paket lain. (Penggunaan vars pragma memalsukan impor, tetapi gunakan sebagai gantinya.)
Sepenuhnya terkualifikasi menggunakan nama paket dan pemisah paket titik dua ganda.
gunakan 'subs' yang ketat;
Pertimbangkan dua program
Dalam kedua kasus kami memiliki sub test_value () dan kami ingin memasukkan hasilnya ke $ a. Namun, saat kami menjalankan kedua program tersebut, kami mendapatkan dua hasil yang berbeda:
Pada program pertama, pada titik kita sampai
$a = test_value;
, Perl tidak mengetahui sub test_value (), dan test_value diinterpretasikan sebagai string 'test_value'. Di program kedua, definisi test_value () muncul sebelum$a = test_value;
baris. Perl menganggap test_value sebagai sub panggilan.Istilah teknis untuk kata-kata yang terisolasi seperti test_value yang mungkin berupa subs dan mungkin string bergantung pada konteks, adalah bareword . Penanganan bareword oleh Perl dapat membingungkan, dan dapat menyebabkan bug dalam program.
Bug adalah apa yang kita temui di program pertama kita, Ingat bahwa Perl tidak akan berharap untuk menemukannya
test_value()
, jadi karena ia belum melihat test_value (), ia mengasumsikan bahwa Anda menginginkan sebuah string. Jadi jika Andause strict subs;
, itu akan menyebabkan program ini mati dengan kesalahan:Solusi untuk kesalahan ini adalah
1. Gunakan tanda kurung untuk menjelaskan bahwa Anda memanggil sub. Jika Perl melihat $ a = test_value () ;,
2. Deklarasikan sub Anda sebelum Anda menggunakannya untuk pertama kali
3. Dan Jika Anda bermaksud menggunakannya sebagai string, kutiplah.
Jadi, penyempitan ini membuat Perl memperlakukan semua bareword sebagai kesalahan sintaks. * Bareword adalah nama kosong atau pengenal yang tidak memiliki interpretasi lain yang dipaksakan oleh konteks. (Konteks sering kali dipaksa oleh kata kunci atau token terdekat, atau dengan pernyataan awal dari kata yang dimaksud.) * Jadi Jika Anda bermaksud menggunakannya sebagai string, kutip dan Jika Anda bermaksud menggunakannya sebagai pemanggilan fungsi, deklarasikan sebelumnya atau gunakan tanda kurung.
Bareword berbahaya karena perilaku yang tidak terduga ini.
use strict; (or use strict 'subs';)
membuatnya dapat diprediksi, karena bareword yang mungkin menyebabkan perilaku aneh di masa mendatang akan membuat program Anda mati sebelum dapat menimbulkan malapetakaAda satu tempat di mana tidak masalah untuk menggunakan bareword bahkan ketika Anda telah mengaktifkan subscriber ketat: saat Anda menetapkan kunci hash.
Bareword dalam kunci hash selalu diartikan sebagai string, jadi tidak ada ambiguitas.
gunakan 'ref' yang ketat;
Ini menghasilkan kesalahan waktu proses jika Anda menggunakan referensi simbolik, dengan sengaja atau tidak. Nilai yang bukan merupakan acuan keras kemudian diperlakukan sebagai acuan simbolis . Artinya, referensi diartikan sebagai string yang mewakili nama variabel global.
gunakan peringatan;
Pragma yang tercakup secara leksikal ini memungkinkan kontrol yang fleksibel atas peringatan bawaan Perl, baik yang dipancarkan oleh kompilator maupun yang dari sistem run-time.
Dari
perldiag
:Jadi mayoritas pesan peringatan dari klasifikasi di bawah yaitu W, D & S dapat dikontrol menggunakan
warnings
pragma.sumber
Kedua pragma ini dapat secara otomatis mengidentifikasi bug dalam kode Anda.
Saya selalu menggunakan ini dalam kode saya:
FATAL
membuat kode mati pada peringatan, sepertistrict
halnya.Untuk informasi tambahan, lihat: Lebih ketat dengan peringatan penggunaan FATAL => 'all';
Juga ... Penyempitan, menurut Seuss
sumber
FATAL => "all"
till runtime, dengan menetapkan ke$SIG{__WARN__} = sub { croak "fatalized warning @_" };
atau Anda mengacaukan compiler mencoba memberi tahu Anda apa yang diperlukan.perlbug
.Ada utas bagus tentang perlmonks tentang pertanyaan ini.
Alasan dasarnya jelas adalah bahwa ketat dan peringatan secara besar-besaran membantu Anda menemukan kesalahan dan membantu proses debug.
sumber
Sumber :: Blog yang berbeda
sumber
Direktif "use strict" memberitahu Perl untuk melakukan pemeriksaan ekstra selama kompilasi kode Anda. Menggunakan direktif ini akan menghemat waktu Anda untuk men-debug kode Perl karena menemukan bug pengkodean umum yang mungkin Anda abaikan sebaliknya.
sumber
Ketat dan peringatan memastikan variabel Anda tidak global.
Jauh lebih rapi untuk dapat memiliki variabel yang unik untuk masing-masing metode daripada harus melacak setiap nama variabel.
$ _, atau tanpa variabel untuk fungsi tertentu, juga dapat berguna untuk menulis kode yang lebih ringkas dengan lebih cepat.
Namun, jika Anda tidak menggunakan strict and warnings, $ _ menjadi global!
sumber
Ketat dan peringatan adalah mode untuk program perl. Hal ini memungkinkan pengguna untuk memasukkan kode dengan lebih bebas dan lebih dari itu, kode perl akan terlihat formal dan standar pengkodeannya akan efektif.
peringatan berarti sama seperti
-w
pada baris perl shebang, jadi ini akan memberi Anda peringatan yang dihasilkan oleh program perl, itu akan ditampilkan di terminalsumber