2012-04-12 2 views
0

이 usex.pl입니다 :strict가 필요한 다른 스크립트의 변수에 대해 불평하는 이유는 무엇입니까?

#use strict; 
our $x = 99; 
1; 

같이 그것은 잘 실행 : 여기

#use strict; 
require 'x.pl'; 
print $x; 

는 x.pl입니다. 내가 usesx.pl 엄격한 사용하는 행의 주석을 해제하면, 내가

Global symbol "$x" requires explicit package name 

사용 여부를 x.pl 엄격한의 얻을 내가 '우리'키워드를 삭제하지만,하지 않는 한 난 (중요하지 않는 것 같다 그것에 관심이 없다.)

나는 Perl을 처음 사용했다. strict가 $ x를 주 스크립트에 표시하지 않는 이유는 무엇입니까?이 문제에 대한 일반적인 해결책은 무엇입니까?

답변

5

Hehe, our은 글로벌 및 어휘 범위의 개념을 혼합하기 때문에 쉽지 않습니다. 그것이하는 일은 strict 'vars'pragma에서 전역 변수를 제외하고 범위를 벗어나는 액세스를 허용하는 것입니다. 범위는 둘러싸는 블록 또는 현재 파일의 끝입니다. Read the full (but brief) story in the manual이며, 명령 행에서 perldoc -f our이라고해도 액세스 할 수 있습니다.

는 스크립트에 관해서는, 당신은 패키지 자격을 갖춘 이름을 사용하는 변수 접근을 수정하여 설명서의 말씀의 진실성을 확인할 수 있습니다

use strict; 
require 'x.pl'; 
print $main::x; 
7

두 가지 이유를.

  1. require이 실행되기 전에 컴파일 타임에 오류가 발생합니다. BEGIN을 사용하면 쉽게 수정할 수 있습니다.

  2. our은 어휘 범위이며 print과 다른 어휘 범위 (파일 또는 블록)이므로 더 이상 적용되지 않습니다.

전체적인 접근 방식은 근본적으로 나쁩니다. 좋은 방법 하나가 있습니다.

package MyConfig; 
use strict; 
use warnings; 
use Exporter qw(import); 
our @EXPORT = qw($x); 
our $x = 123; 
1; 

use strict; 
use warnings; 
use MyConfig; 
print "$x\n"; 
관련 문제