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
Simbol global "$ variablename" membutuhkan nama paket eksplisit di scriptname.pl baris 3
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
# prog 1
$a = test_value;
print "First program: ", $a, "\n";
sub test_value { return "test passed"; }
Output: First program's result: test_value
# prog 2
sub test_value { return "test passed"; }
$a = test_value;
print "Second program: ", $a, "\n";
Output: Second program's result: test passed
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 Anda use strict subs;
, itu akan menyebabkan program ini mati dengan kesalahan:
Bareword "test_value" tidak diizinkan sementara "strict subs" digunakan di ./a6-strictubs.pl baris 3.
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
use strict;
sub test_value; # Declares that there's a test_value() coming later ...
my $a = test_value; # ...so Perl will know this line is okay.
.......
sub test_value { return "test_passed"; }
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 malapetaka
Ada satu tempat di mana tidak masalah untuk menggunakan bareword bahkan ketika Anda telah mengaktifkan subscriber ketat: saat Anda menetapkan kunci hash.
$hash{sample} = 6; # Same as $hash{'sample'} = 6
%other_hash = ( pie => 'apple' );
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.
use strict 'refs';
$ref = \$foo; # Store "real" (hard) reference.
print $$ref; # Dereferencing is ok.
$ref = "foo"; # Store name of global (package) variable.
print $$ref; # WRONG, run-time error under strict refs.
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.
(W) Peringatan (opsional)
(D) Penghentian (diaktifkan secara default)
(S) Peringatan parah (diaktifkan secara default)
Saya telah membuat daftar beberapa pesan peringatan yang sering muncul di bawah menurut klasifikasi. Untuk info rinci tentang mereka dan pesan lainnya merujuk perldiag
(W) Peringatan (opsional):
Argumen hilang di% s
Argumen yang hilang ke -% c
(Apakah maksud Anda &% s sebagai gantinya?)
(Apakah yang Anda maksud adalah "lokal" alih-alih "kami"?)
(Apakah maksud Anda $ atau @ alih-alih%?)
'% S 'bukan
panjang referensi kode () yang digunakan pada% s
Salah taruh _ dalam bilangan
(D) Penghentian (diaktifkan secara default):
didefinisikan (@array) tidak digunakan lagi
didefinisikan (% hash) tidak
digunakan lagi Penggunaan my () dalam kondisi palsu
$ # tidak lagi didukung
(S) Peringatan parah (diaktifkan secara default)
elseif harus elsif
% s ditemukan di tempat yang diharapkan operator
(Operator hilang sebelum% s?)
(Titik koma hilang pada baris sebelumnya?)
% s tidak pernah diperkenalkan
Operator atau titik koma hilang sebelum% s
Masalah yang diutamakan: terbuka% s harus dibuka (% s)
Prototipe tidak cocok:% s vs% s
Peringatan: Penggunaan "% s" tanpa tanda kurung tidak jelas
Tidak dapat membuka% s:% s
use loose;