분명히 use strict
(필수)는이 선언을 강제 할 수있는 제대로 코드에 힘 펄을 할 때 문자열과 잠수정에 명시되고, 사용할 수는 barewords을 즉 또는주의 심판을 사용한다. 참고 : 오류가있는 경우 strict를 사용하면 사용되는 경우 실행이 중단됩니다.
use warnings;
세미콜론을 놓친 것과 같은 프로그램에서 입력 실수를 찾는 데 도움이 되지만 'elsif'가 아닌 'elseif'를 사용했습니다. 사용되지 않는 구문이나 함수를 사용하고 있습니다. 참고 : 경고 사용은 경고 만 제공하고 실행을 계속합니다. 즉, 실행을 중단하지 않습니다.
어쨌든 아래에서 자세히 설명하는 것이 더 나을 것입니다.
에서 perl.com (내가 좋아하는) :
엄격한 'vars'를 사용하십시오.
즉, 변수를 사용하기 전에 항상 변수를 선언해야합니다.
선언하지 않으면 선언되지 않은 변수에 대한 오류 메시지가 표시됩니다.
전역 기호 "$ variablename"에는 scriptname.pl 행 3에 명시적인 패키지 이름이 필요합니다.
이 경고는 Perl이 변수의 범위에 대해 정확히 명확하지 않다는 것을 의미합니다. 따라서 변수에 대해 명시해야합니다. 즉, 변수를 선언 my
하여 현재 블록으로 제한하거나 정규화 된 이름 (예 : $ MAIN :: variablename)으로 참조해야합니다.
따라서 다음 기준 중 하나 이상을 충족하지 않는 변수에 액세스하려고하면 컴파일 타임 오류가 트리거됩니다.
@ARGV, % ENV와 같은 Perl 자체 및 $와 같은 모든 전역 구두점 변수에 의해 미리 정의됩니다. 또는 $ _.
our (글로벌 용) 또는 my (어휘 용)로 선언되었습니다.
다른 패키지에서 가져 왔습니다. (사용 vars pragma는 가져 오기를 위조하지만 대신 사용합니다.)
패키지 이름과 이중 콜론 패키지 구분 기호를 사용하여 정규화되었습니다.
엄격한 '구독자'를 사용하십시오.
두 가지 프로그램 고려
# 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
두 경우 모두 test_value () 하위가 있고 그 결과를 $ a에 넣고 싶습니다. 그러나 두 프로그램을 실행하면 두 가지 다른 결과가 나타납니다.
첫 번째 프로그램에서 우리가에 도달하는 시점 $a = test_value;
에서 Perl은 test_value () 하위를 알지 못하며 test_value는 문자열 'test_value'로 해석됩니다. 두 번째 프로그램에서 test_value ()의 정의는 $a = test_value;
줄 앞에옵니다 . Perl은 test_value를 하위 호출로 생각합니다.
subs 일 수 있고 컨텍스트에 따라 문자열 일 수있는 test_value와 같은 격리 된 단어의 기술 용어는 bareword 입니다. Perl의 베어 워드 처리는 혼란 스러울 수 있으며 프로그램에서 버그를 유발할 수 있습니다.
버그는 우리가 첫 번째 프로그램에서 만난 것입니다. Perl은 찾을 것을 기대하지 않을 것입니다 test_value()
. 따라서 아직 test_value ()를 보지 못했기 때문에 문자열을 원한다고 가정합니다. 따라서이 use strict subs;
프로그램은 오류와 함께 종료됩니다.
Bareword "test_value"는 ./a6-strictsubs.pl 행 3에서 "strict subs"를 사용하는 동안 허용되지 않습니다.
이 오류에 대한 해결책은
1입니다. 괄호를 사용하여 하위를 호출하고 있음을 명확히합니다. Perl에 $ a = test_value ();가 표시되면
2. 처음 사용하기 전에 하위를 선언합니다.
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. 그리고 그것을 문자열로 사용하려는 경우 인용하십시오.
따라서 이러한 제한으로 인해 Perl은 모든 베어 워드를 구문 오류로 취급합니다. * 베어 워드 는 컨텍스트에 의해 강제되는 다른 해석이없는 이름 또는 식별자입니다. (컨텍스트는 종종 근처의 키워드 나 토큰 또는 해당 단어의 사전 선언에 의해 강제됩니다.) * 따라서 문자열로 사용하려는 경우 인용하고 함수 호출로 사용하려는 경우 사전 선언 또는 괄호를 사용하십시오.
베어 워드는 이러한 예측할 수없는 동작으로 인해 위험합니다. use strict; (or use strict 'subs';)
미래에 이상한 동작을 유발할 수있는 베어 워드는 프로그램이 혼란을 일으키기 전에 죽게 할 것이기 때문입니다.
엄격한 구독을 켰을 때도 베어 워드를 사용해도 괜찮은 곳이 있습니다 : 해시 키를 할당 할 때입니다.
$hash{sample} = 6; # Same as $hash{'sample'} = 6
%other_hash = ( pie => 'apple' );
해시 키의 베어 워드는 항상 문자열로 해석되므로 모호성이 없습니다.
엄격한 'refs'를 사용하십시오.
의도적 으로든 아니든 기호 참조를 사용하면 런타임 오류가 발생합니다. 하드 참조가 아닌 값은 기호 참조 로 처리됩니다 . 즉, 참조는 전역 변수의 이름을 나타내는 문자열로 해석됩니다.
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.
경고를 사용하십시오.
이 어휘 범위의 pragma를 사용하면 Perl의 내장 경고 (컴파일러와 런타임 시스템의 경고 모두)를 유연하게 제어 할 수 있습니다.
에서 perldiag
:
따라서 아래 분류, 즉 W, D & S의 대부분의 경고 메시지는 warnings
pragma를 사용하여 제어 할 수 있습니다 .
(W) 경고 (선택 사항)
(D) 사용 중단 (기본적으로 활성화 됨)
(S) 심각한 경고 (기본적으로 활성화 됨)
자주 발생하는 경고 메시지를 분류별로 아래에 나열했습니다. 이들 및 기타 메시지에 대한 자세한 정보는 perldiag 를 참조하십시오.
(W) 경고 (선택 사항) :
% s에
인수가 없습니다.-% c에 인수가 없습니다
(대신 & % s을
(를) 의미 했습니까 ?) ( "our"대신 "local"
을 의미 했습니까 ?) (% 대신 $ 또는 @를 의미 했습니까?)
'% s '은 코드 기준 아니다
%의 사용 길이 ()
숫자 _가 잘못된
(D) 지원 중단 (기본적으로 활성화 됨) :
defined (@array) is deprecated
defined (% hash) is deprecated
my () in false conditional
$ # is no longer supported
(S) 심각한 경고 (기본적으로 활성화 됨)
elseif는
연산자가 예상 한 위치에서 elsif % s을 (를) 찾았습니다
(% s 앞에 연산자가 없습니까?)
(이전 줄에 세미콜론이 없습니까?)
% s이 (가 ) % s
전에 연산자 또는 세미콜론이 누락 됨
우선 순위 문제 : 열려있는 % s가 열려 있어야합니다 (% s).
프로토 타입 불일치 : % s 대 % s
경고 : 괄호없이 "% s"를 사용하는 것은 모호합니다
. % s을 (를) 열 수 없습니다. % s
use loose;