2012-08-27 4 views
4

내가 다른 스크립트의 STDOUT에서 읽고있는 펄 변수가 펄. 변수 앞에는 15 자 이상의 특수 문자 (특별하지 않고 특별하지만 숨김)가 인쇄 할 때 표시되지 않습니다.제거 보이지 않는 문자는

length($var) <--- Returns a number 10-15 larger than "somestring" has chars 

내가 지금과 같은 특수 문자를 제거 할 수 있습니다 :

$var =~ s/[^[:print:]]+//g 

을하지만 특수 문자가 제거 된 후에 공개됩니다 이외의 특수 문자도 있다는 것을 나타납니다

print $var <---- Displays "0;<hostname>somestring" 
      (where <hostname> is the system hostname) 

특수 문자와 숨겨진 특수 문자를 모두 제거 할 수 있습니까? 나는 해시의 키로 $ var에를 사용하고 "somestring"

$hash{$var} = 123 
print $hash{'somestring'} 

생각하여 참조 할 수 있도록하려면?

+0

출력 결과를 정확히 알려 주시겠습니까? 예 : 'use Data :: Dumper; 프린트 덤퍼 ($ var)'. –

+0

또는 쉘에서 SomeScript.sh를 실행하고'hd' ('hexdump -C')에 파이프하십시오. 또는 심지어'cat -A'. 당신은 이미 대답을 받아 들였지만 어쨌든 나는 흥미 롭다. 그리고 나는 SomeScritp.sh가 터미널 (vt100 또는 무엇이든)을 제어하기위한 Escape 코드를 출력하고 있다고 생각할 것이다. – cas

+0

Moritz와 Craig가 말했듯이, "옳은 것"이 될 때까지 정규 표현식을 던지기보다는 문자가 제거되어야하는 것을 정확히 알아내는 것이 현명 할 것입니다. – Borodin

답변

6

제거 할 문자가 인쇄 할 수없는 문자 앞에 있다고 가정 할 수 있습니까?

그렇다면, 어쩌면

$var =~ s/.*[^[:print:]]+//; 

과 같이 작동 할 수?

+0

훌륭함, 그 트릭을했습니다. – Jonathan

+1

-1 : 인쇄 할 수없는 모든 곳의 모든 개행 문자를 제거하십시오. 문자열에 끝에 개행 문자가 있으면 전체 문자열이 삭제됩니다. 왜'/ g' 수식어인가? 문자열의 시작 부분에 앵커가없는 이유는 무엇입니까? 정확히 어떤 문자가 제거되어야하는지 알아내는 것이 현명합니다. – Borodin

+0

맞습니다. 완전히 쓸모없는'/ g' (복사/붙여 넣기에서 지워짐)을 제거했습니다. 그리고 나는 또한 어떤 터미널 \ n chomped 것이라고 가정했다. (그러나 나는 추가 닻이 쓸모 없다고 생각한다.) –

관련 문제