Görünüşe göre use strictperl'i düzgün bir şekilde kodlamaya zorlamak istediğinizde kullanılmalı (zorunludur), bu da bildirimi zorlayabilir, dizeler ve alt sözcükler üzerinde açık olabilir, yani barewords veya referansları dikkatli kullanarak. Not: Hatalar varsa, sıkı kullan kullanılırsa yürütmeyi durdurur.
use warnings;Bir noktalı virgülü kaçırmışsınız gibi programdaki yazım hatalarını bulmanıza yardımcı olacak olsa da, 'elsif' değil 'elseif' kullandınız, bunun gibi kullanımdan kaldırılmış sözdizimi veya işlevi kullanıyorsunuz. Not: Kullanım uyarıları yalnızca uyarılar sağlar ve yürütmeye devam eder, yani yürütmeyi iptal etmez ..
Her neyse, aşağıda belirttiğim ayrıntılara girersek daha iyi olur.
Gönderen perl.com (en sevdiğim):
katı 'değişkenler' kullanın;
bu, değişkenleri kullanmadan önce her zaman bildirmeniz gerektiği anlamına gelir.
Bildirmezseniz, muhtemelen bildirilmemiş değişken için hata mesajı alırsınız.
"$ Variablename" global sembolü, scriptname.pl 3. satırda açık paket adı gerektiriyor
Bu uyarı Perl'in değişkenin kapsamının ne olduğu konusunda tam olarak net olmadığı anlamına gelir. Bu yüzden değişkenleriniz hakkında açık olmanız gerekir, yani onları mymevcut blokla sınırlı olarak bildirmek veya onlara tam olarak nitelenmiş isimleriyle atıfta bulunmak (örneğin: $ MAIN :: variablename).
Bu nedenle, aşağıdaki kriterlerden en az birini karşılamayan bir değişkene erişmeye çalışırsanız bir derleme zamanı hatası tetiklenir:
@ARGV,% ENV ve $ gibi tüm genel noktalama değişkenleri gibi Perl'in kendisi tarafından önceden tanımlanmıştır. veya $ _.
Bizim (global için) veya benim (sözlük için) ile ilan edildi.
Başka bir paketten içe aktarıldı. (Vars pragma kullanımı bir içe aktarmayı taklit eder, ancak onun yerine bizimkini kullanın.)
Paket adını ve çift iki nokta üst üste paket ayırıcısını kullanarak tam nitelikli.
sıkı 'alt' kullanın;
İki program düşünün
# 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
Her iki durumda da bir test_value () subumuz var ve sonucunu $ a'ya koymak istiyoruz. Yine de, iki programı çalıştırdığımızda iki farklı sonuç elde ederiz:
İlk programda, geldiğimiz noktada $a = test_value;Perl herhangi bir test_value () altını bilmiyor ve test_value 'test_value' dizesi olarak yorumlanıyor. İkinci programda test_value () tanımı $a = test_value;satırdan önce gelir . Perl, test_value'yu alt çağrı olarak düşünür.
Bu arada, alt ve bağlama bağlı olarak dizeler olabilecek test_value gibi yalıtılmış sözcükler için teknik terim açık bir sözcüktür . Perl'in barewords kullanımı kafa karıştırıcı olabilir ve programda hataya neden olabilir.
Hata, ilk programımızda karşılaştığımız şeydir, Perl'in bulmayı dört gözle test_value()beklemeyeceğini unutmayın, bu nedenle test_value () 'u daha önce görmediğinden, bir dizge istediğinizi varsayar. Yani eğer sen use strict subs;, bu programın bir hata ile ölmesine sebep olur:
./A6-strictsubs.pl 3. satırda "sıkı alt" kullanımdayken bareword "test_value" kullanımına izin verilmez.
Bu hatanın çözümü
1 olacaktır . Bir aboneyi aradığınızı açıkça belirtmek için parantez kullanın. Perl $ a = test_value (); görürse,
2. Aboneliğinizi ilk kullanmadan önce bildirin
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. Ve onu bir dizge olarak kullanmak istiyorsan, alıntı yap.
Bu nedenle, bu kısıtlama Perl'in tüm çıplak sözcükleri sözdizimi hataları olarak değerlendirmesine neden olur. * Bir engel , bağlam tarafından zorlanan başka bir yorumu olmayan herhangi bir çıplak isim veya tanımlayıcıdır. (Bağlam, genellikle yakındaki bir anahtar kelime veya simge tarafından veya söz konusu kelimenin önceden bildirilmesiyle zorlanır.) * Dolayısıyla, onu bir dizge olarak kullanmak istiyorsanız, alıntı yapın ve bir işlev çağrısı olarak kullanmak istiyorsanız, önceden beyan edin. veya parantez kullanın.
Barewords, bu öngörülemeyen davranış nedeniyle tehlikelidir. use strict; (or use strict 'subs';)onları öngörülebilir kılar, çünkü gelecekte tuhaf davranışlara neden olabilecek yalancı sözler, programınızı hasara yol açmadan önce ölür.
Katı aboneleri açmış olsanız bile, barewords kullanmanın uygun olduğu bir yer var: hash anahtarları atarken.
$hash{sample} = 6; # Same as $hash{'sample'} = 6
%other_hash = ( pie => 'apple' );
Hash anahtarlarındaki barewords her zaman dizeler olarak yorumlanır, bu nedenle belirsizlik yoktur.
katı 'referanslar' kullanın;
Bu, kasıtlı olarak veya başka bir şekilde sembolik referanslar kullanırsanız bir çalışma zamanı hatası oluşturur. Sabit bir referans olmayan bir değer daha sonra sembolik bir referans olarak kabul edilir . Yani başvuru, global bir değişkenin adını temsil eden bir dizge olarak yorumlanır.
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.
uyarıları kullanın;
Bu sözcüksel kapsamlı pragma, hem derleyici tarafından hem de çalışma zamanı sisteminden gönderilenler olmak üzere Perl'in yerleşik uyarıları üzerinde esnek kontrole izin verir.
Kimden perldiag:
Bu nedenle, aşağıdaki sınıflandırmalardaki uyarı mesajlarının çoğu, yani W, D ve S, warningspragma kullanılarak kontrol edilebilir .
(W) Bir uyarı (isteğe bağlı)
(D) Bir kullanımdan kaldırma (varsayılan olarak etkindir)
(S) Ciddi bir uyarı (varsayılan olarak etkindir)
Aşağıda sıklıkla görülen uyarı mesajlarından bazılarını sınıflandırmalara göre listeledim. Onlar ve diğer mesajlar hakkında ayrıntılı bilgi için perldiag'a bakın
(W) Bir uyarı (isteğe bağlı):
% S içinde
eksik bağımsız değişken -% c için bağımsız değişken eksik
(Onun yerine &% s mi demek istediniz?)
("Bizim" yerine "yerel" mi demek istediniz?)
(% Yerine $ mı yoksa @ mi demek istediniz?)
'% S ',
numarada
% s
Yanlış yerleştirilmiş _ üzerinde kullanılan bir kod referans uzunluğu () değil
(D) Kullanımdan kaldırma (varsayılan olarak etkindir):
tanımlı (@array) kullanımdan kaldırıldı
tanımlandı (% hash) kullanımdan kaldırıldı
my () 'ın yanlış koşullu
$ # içinde kullanımı artık desteklenmiyor
(S) Ciddi bir uyarı (varsayılan olarak etkindir)
elseif,
operatörün beklediği yerde elsif % s bulunmalıdır
(% s'den önce operatör eksik?)
(Önceki satırda
noktalı virgül eksik mi?)
% s hiç tanıtılmamış
Operatör veya% s öncesinde noktalı virgül eksik
Öncelik sorunu: open% s açık olmalı (% s)
Prototip uyuşmazlığı:% s -% s
Uyarı: Parantez olmadan "% s" kullanımı belirsizdir
% s açılamıyor:% s
use loose;