2017-02-01 1 views
0

glob을 사용하여 파일을 검색하는 중 이상한 동작이 발생합니다. (의도는 있지만 생각하지 않습니다.)접두어 글로브 접두어가있는 파일이 있는지 확인합니다.

나는 aaa:bbbaaa:ccc의 두 파일이 있습니다.

프리픽스가 aaa:* 인 파일이 있는지 확인하는 코드가 있습니다. 나는이 코드로 이것을한다 :

my $filelocation_special = "aaa"; 

if (glob($filelocation_special . ":*")) { 
    # file(s) exists! 
} 

이것은 작동한다. 그러나 동일한 코드를 두 번 더 실행하면 glob가 undefined를 반환합니다.

이 내 수익률은 다음과 같습니다 (대부분의 시간 어쨌든)

print STDERR "glob: " . glob($filelocation_special . ":*") . "\n"; 

# 1 run: aaa:bbb 
# 2 run: aaa:ccc 
# 3 run: 

나는이 접두사를 가진 파일이 존재하는 경우 언제나 확인glob를 다시 하기 위해 무엇을 할 수 있는가?

어쩌면 나는 다른 검사를 모두 사용해야 할 수도 있지만, 빠른 것을 찾지 못하고 파일이 존재하는지 검사 할 수 없습니다.

+0

죄송합니다. 내 질문을 업데이트했습니다. –

+1

만약 내가 3 번 복사하면, 그것은 나를 위해 작동합니다. http://stackoverflow.com/help/mcve – toolic

+0

http://perldoc.perl.org/File/Glob.html에서이'CORE :: glob' 또는': bsd_glob' 파일을 찾으십니까? – simbabque

답변

3

if (glob(...))call to glob in scalar context입니다. 리스트가 소모 될 때 스칼라 문맥에서

는 같은 파일 이름 확장을 통해 글로브 반복은 미확정 복귀.

그래서 매번 동일한 인수, 스칼라 문맥에서 glob를 호출 을 코드의 같은 라인에서, 당신은 다른 결과를 얻을 것이다, 결국 당신은 undef을 얻을 것이다 때 일치하는 파일의 목록 당신의 주장은 다 써 버렸습니다.

표현식에 "이 패턴과 일치하는 파일이 있다면 ..."을 의미하게하려면 목록 컨텍스트를 어떻게 사용해야합니다.

@tmp = glob(pattern) 
if (@tmp) 

if (()=glob(pattern)) 

if (@{[glob(pattern)]}) 


기분 전환 : 그들은 심지어

if (@ <= glob(pattern)) 
if (@ := glob(pattern)) 
처럼 쓸 수

if (@@=glob(pattern)) 
if (@<=glob(pattern)) 
if (@:=glob(pattern)) 

과 (@** 문장 부호 문자의 많은 값에 유효한 전역 배열 식별자이기 때문에) 이들의도 작동

이므로 secret operators에 대한 몇 가지 후보가 제안됩니다.

@@ = EXPR  like the goatse operator, returns a count of elements 
@ <= EXPR  in EXPR when EXPR is evaluated in list context; useful 
@ := EXPR  when EXPR in scalar context does not do this 
+0

와우. 그것은 정말 근사한 코드입니다. 나는 그것을 시험해 보았다. 그리고 그것은 제가 원했던 방식대로 작동했습니다. 감사! –

+0

[이 질문에] 스칼라 glob에 대한 좋은 토론이 있습니다 (http://stackoverflow.com/questions/2633447/why-doesnt-perl-file-glob-work-outside-of-a-loop-in-scalar- 문맥). – mob

+1

그런 기호 식별자는 Perl 기본 제공 변수 용으로 예약되어 있으므로 사용하지 않는 것이 좋습니다. 대부분의 Perl 프로그래머는이를 파싱 할 수 없으므로 정의되지 않은 장소에 공백이있는 정의되지 않은 기호 변수를 사용하여 코드를 작성하는 것은 매우 중요하지 않습니다. 'glob' 패턴과 일치하는 파일의 존재를 확인하는 확실한 방법은'if (my @files = glob 'aaa : *') {...}'배열'@ files'가 길이 if 블록의 "비밀 운영자"는 생산 소프트웨어에서 사용하기위한 유효한 구성보다는 주로 유아 장난감입니다. – Borodin

관련 문제