2012-03-14 3 views
0

내 프로그램이 파일을 한 줄씩 읽습니다. 그러나 인쇄 할 수없는 문자 (예 : 십진수가 32 미만의 문자)가 발견되면 콘솔에 오류 메시지 만 출력하려고합니다. 여기인쇄 할 수없는 문자가 발견되면 검색 - Perl

내가 비 인쇄 내 파일에 어떻게 될지 확실하지 않다 생각하기 때문에, 그것은 작동하고 있는지 잘 모르겠어요

while($line=<FILE>){ 
print $line; 
$line =~ s/^\s+//; #remove leading spaces 
$line =~ s/\s+$//; #remove trailing spaces 
if(/[\x00-\x1F]/){ 
    print "Found a non printable!"; 
} 

이 무엇인가?

이 내 현재의 입력 파일입니다

Pa$$word412 
999 

캐리지 리턴 비 인쇄하지 않을까요? 그런 다음 내 경고 메시지를 인쇄해서는 안됩니까?

감사합니다.

+0

관련 : http://stackoverflow.com/questions/9317164/detect-whether-perl-string-is-printable – daxim

답변

1

캐리지 리턴은 정의에 따라 인쇄 할 수 없습니다. 당신은 당신이 $line에 라인을 읽는하지만 경기에이 참조되지 않습니다

$line =~ s/\s+$//; #remove trailing spaces 
+1

오해 나는 그것을 완전히 이해하지 못했다고 생각한다! 나는 그 라인을 주석 처리하고 작동한다. 감사! –

2

을 말할 때 그러나 당신은 당신의 입력에서 캐리지 리턴을 제거한다. 당신은 다음과 같이 명시 적으로 $line 일치해야합니다 :

if ($line =~ /[\x00-\x1F]/) { 

또는 더 나은 아직, 단지 $_로 라인을 넣어 : 그들은 \s 일치 제거되기 때문에

while (<FILE>) { 
    print; 

    s/^\s+//; # remove leading spaces 
    s/\s+$//; # remove trailing spaces 

    if (/[\x00-\x1F]/) { 
     print "WARNING -- Non-printables were found; they have been detected."; 
    } 
} 

후행 줄 바꿈은 경고를 트리거하지 않습니다 후행 공간 제거로 테스트 케이스가 필요하다면 파일에 탭 문자를 넣으십시오. 그러면 [\x00-\x1F]과 일치해야합니다.

+0

도움 주셔서 감사합니다! –

관련 문제