2014-06-17 9 views
0

200 바이트 레코드 끝에 201 및 202 바이트로 \ r \ n을 추가하는 Perl 프로그램을 작성하고 있습니다. 내가 할 노력하고이 방법이 :레코드 끝에 x0D x0A를 추가하십시오.

use constant REPORT_LINE_LEN => 200; 

while(($rc = read $infile, $report_line, REPORT_LINE_LEN(), 0) != 0) 
{ 
    chomp $report_line; 
    $report_line .= "\r\n" . "\n"; 
    print $outfile $report_line; 
} 

캐리지 리턴^M 문자 위치 (201)에 있고, 나는 202에 \ n을 필요하지만이 증가하지 않고 거기에 배치 얻이 수없는 것 레코드의 길이는 202 바이트 이상입니다. vim을 사용하여^M의 위치를 ​​확인 중이며 파일이 여전히 Unix 형식임을 나타냅니다.

나는 많은 출처를 조사해 왔으며, 어리둥절 해했다. 마지막 두 바이트가 어떻게 정력에 나타날지를 포함하여 어떤 도움을 주시면 감사하겠습니다.

나는 vim에서 레코드 길이를 확인하기 위해 '$'를 눌러 레코드 길이를 확인합니다. 지금은 201이라고 말합니다. rmvtape.out이이 레코드를 포함하는 파일 인 경우 레코드 길이를 확인하기 위해 head -n 1 rmvtape.out | wc -c도 사용하고 있습니다. 길이는 202입니다.

그래서이 경우 vim에서^M이 보이지 않습니까?

+0

는 출력 파일이 ['binmode'] (http://perldoc.perl.org/functions/binmode.html) 사용하고 있는지 확인합니다 : 마지막 \n 모든 것이 잘되어야 예컨대을 생략합니다. 그럼 그냥 "\ r \ n"하는 것으로 충분합니다. – Miller

+0

기록 길이를 확인하는 방법에 대해 자세히 설명해 주시겠습니까? 또한 "202 바이트 이상"은 얼마입니까? –

+0

@ Mr.Llama 방금 답변을 편집했습니다. – octopusgrabbus

답변

2

$ report_line. = "\ r \ n". "\엔";

당신은 여기 예컨대 \r, \n 다른 \n을 세 문자를 추가. 는

$report_line .= "\r\n"; 
+0

@Steffen_Ulrich 나는 이것을 시도했지만, vim의 위치 수는 200으로 돌아가고,^M은 vim에서 빠져있다. 유형은 여전히 ​​유닉스이다. – octopusgrabbus

+2

''unpack ("H *", $ report_line)'을 사용하여 실제로 줄에있는 옥텟을보고'length ($ report_line)'로 길이를 확인하십시오. 이것들이 올바른 값을 주면'$ output'이 문제가됩니다. @Miller가 제안한 것처럼 binmode를 사용하십시오. 그리고 vim을 신뢰하지 말고 hexdump를 사용하여 실제로 무엇이 있는지 확인하십시오. –

+0

@Steffen_Ulrich 메서드 결과는 202 바이트입니다. hexdump로 확인하십시오. – octopusgrabbus

관련 문제