2014-04-14 3 views
6

나는 몇 가지 코드를 찾고 있어요,하지만 난 다음 줄이 무엇을하고 있는지/체크 이해가 안 :이 줄은 perl에서 무엇을 의미합니까?

return if !%Foo::Details:: ; 

이 일을 정확히 무엇을? Foo :: Details 모듈의 존재 여부를 확인하고 있습니까?

+3

모듈이 심볼 테이블에로드되었는지 여부를 테스트하는 정말 좋지 않은 방법입니다. '% Foo :: Details'는'Foo :: Details' 패키지의 심볼 테이블 엔트리입니다. 만약로드되지 않았다면 false를 리턴 할 것입니다. ['perlmod'의 심볼 테이블 섹션을보십시오.] (http://perldoc.perl.org/perlmod.html#Symbol-Tables) –

+0

@HunterMcMillen 나는 그것의 compactness에 유일하게 기초를 둔 우아하다고 생각합니다. 정확히 그게 가난한가? – Jarmund

+1

이 코드 조각이 무엇을하고 있는지 명확하게 밝히지는 않았으므로 이것이 내가 * 가난하다고 생각하는 이유입니다. 더 나은, 더 읽기 쉬운 솔루션이 있습니다. –

답변

9

스칼라 컨텍스트의 해시가 비어 있으면 false를 반환하므로 해시가 %Foo::Details::이 비어 있으면 코드에서 빈 목록을 반환합니다.

해시는 Foo::Details 네임 스페이스의 기호 표입니다. 패키지 변수 또는 하위가 Foo::Details 네임 스페이스에 만들어지면 변수 또는 하위 이름에 해당하는 glob가 %Foo::Details::에 만들어집니다. 따라서 Foo :: Details 네임 스페이스가 비어 있으면 빈 목록을 반환합니다.

$ cat >Foo/Details.pm 
package Foo::Details; 
sub boo { } 
1; 

$ perl -E'say %Foo::Details:: ?1:0;' 
0 

$ perl -E'use Foo::Details; say %Foo::Details:: ?1:0;' 
1 

Foo :: Details 모듈이로드 되었는지를 확인하려고 할 수도 있지만 완벽하지는 않습니다. 예를 들어, Foo :: Details :: Bar가로드 된 경우에도 Foo :: Details가로드되었다고 생각합니다. Foo :: Details가로드되었는지 확인하려면 $INC{"Foo/Details.pm"}이 true인지 확인하는 것이 좋습니다. 이 접근 방식의 문제점은 "인라인 된 모듈"을 찾지 못한다는 것입니다.

3

이 코드는 모듈이로드되었는지 여부를 테스트합니다. %Foo::Details::은 모듈 Foo::Details의 기호 표입니다.

하면 Foo::Details!으로 부정하는 경우 true를 반환하고에 어떤 함수에서 반환합니다 (이 요소가 없기 때문에) %Foo::Details::는 false를 돌려줍니다로드되지 않았다.

당신의 심볼 테이블에 대한 자세한 내용을보실 수 있습니다 perlmod#Symbol Tables

here is another SO post 또한 모듈로드 여부를 결정하는 방법에 대해 설명합니다.

+0

% Foo :: Details :: *는 모듈 – ysth

+0

의 심볼 테이블입니다. 두 번째 단락이 잘못되었습니다. 내 대답을 보라. – ikegami

+0

기술적으로 엔트리가 아닌가요? '% main ::'에 저장 되었기 때문에? –

관련 문제