2008-09-02 6 views
3

Interprocess (일반적으로 하위 프로세스) 통신을 지원하는 환경 변수를 설정하는 Perl로 작성된 프레임 워크가 있습니다. 우리는 XML-ish 파일에 일련의 키/값 쌍을 유지합니다. 우리는 키 이름을 낙타의 경우 somethingLikeThis으로 만들려고했습니다. 이 모든 것이 잘 작동합니다.Perl Windows 환경 키 저장하기

최근 우리는 Windows에서 UNIX로 제어 (체인) 프로세스를 전달해야했습니다. Windows에서 파일로 %ENV 해시를 뱉어 낼 때 somethingLikeThis 키는 SOMETHINGLIKETHIS이됩니다. UNIX 프로세스가 파일을 선택하여 환경을 다시로드하고 $ENV{somethingLikeThis} 값을 조회하면 UNIX가 대소 문자를 구분하므로 존재하지 않습니다 (Windows 측에서 동일한 코드가 올바르게 작동 함).

우리는 이후 모든 키를 대문자로 변경하고 문제를 해결했지만 지루하고 사용자에게 고통을 초래했습니다. Windows에서 Perl이 환경 해시 키의 대소 문자를 유지하도록하는 방법이 있습니까?

답변

2

내가 기억하는 한, 환경 변수에 ALL_CAPS를 사용하는 것이 Windows 및 * NIX 환경 모두에서 권장되는 방법입니다. 내 생각에 Perl은 일종의 레거시 API를 사용하여 환경에 액세스하고 있으므로 변수의 대문자 전용 이름 만 검색합니다.

어쨌든 그와 같은 것을 의지해서는 안됩니다. 변수를 설정하도록 사용자에게 요청하는 경우 단순한 맞춤법 오류가 얼마나 큰 악영향과 혼란을 일으키는 지 상상해보십시오! 이름없는 것으로 남아있는 일부 OS는 여전히 대소 문자를 구분하는 방법을 배웠다는 것을 기억해야합니다 ...

3

Windows 환경 변수가 실제로 대소 문자를 구별한다는 것을 알게 될 것이므로 키는 대문자입니다. 혼란을 피하기 위해서. 이런 식으로 대소 문자를 구별하지 않는 Windows 스크립트는 다른 모든 것과 동일한 변수를 사용할 수 있습니다.

0

Jack M : 동의 : Windows에서는 문제가되지 않습니다. 환경 변수 Foo를 만들면 Perl에서 $ ENV {FOO} 또는 $ ENV {fOO} 또는 $ ENV {foo}로 참조 할 수 있습니다. 문제는 다음과 같습니다. Foo로 생성하고 전체 % ENV를 파일에 덤프 한 다음 환경 해시를 다시 만들고 $ ENV {Foo}를 참조하는 동일한 스크립트를 사용하기 위해 * NX에서 파일을 읽습니다. 해시 값은 그렇지 않습니다. ($ ENV {FOO}가 존재합니다).

우리는 davidg가 제안한 대문자 (UPPERCASE) 해결 방법을 모두 채택했습니다. Windows의 Perl에서 % ENV 해시에 키를 쓸 때 "유지"하는 방법이 있는지 궁금합니다.

0

내가 아는 한 최선의 방법은 없습니다. % ENV 대신 다른 해시를 사용하는 것이 더 나을 것 같습니다. 많은 외부 모듈을 호출하고 그 사이에서 동일한 변수를 추적하려는 경우 팩토리 패턴이 작동하여 DRY가 손상되지 않고 여러 모듈에서 대/소문자를 구분하는 해시를 사용할 수 있습니다. 그런 다음이 변수를 공장의 모든 객체에 업데이트하는 것이 유일한 방법이지만,이를 해결할 수있을 것입니다.

2

먼저, 문제를 해결하기 위해 세트 주변의 백틱을 사용하고 직접 파싱하는 것이 효과적 일 것이라고 생각합니다. 내 Windows 시스템에서이 스크립트는 정상적으로 작동했습니다. 낙타 책에서

my %env = map {/(.*?)=(.*)/;} `set`; 
print join(' ', sort keys %env); 

, 25 장에서 조언 : 휴대용 펄은, 시스템의 상호 작용 섹션 %의 ENV에 기존 변수 특정 환경에 의존하지 말고, %에 그 어떤 것도 생각하지 않는다 "입니다 ENV는 대소 문자를 구별하거나 대소 문자를 구별합니다. 환경 변수에 대한 유닉스 상속 의미를 가정하지 마십시오. 일부 시스템에서는 다른 모든 프로세스에서 볼 수 있습니다. "

관련 문제