2012-02-08 3 views
0

문자열에 컴퓨터 이름을 도트 (.)로 결합하려고하면 Perl 프로그램에서 문제가 발생합니다. 아래 코드를 참조하십시오.Perl에서 도트 (.)로 두 문자열 결합하기

#!/usr/bin/perl 
use strict; 
use warnings; 

chomp(my $COMPUTERNAME = `hostname`); #this should give the computername e.g CH-B7G33 
my $complog = $COMPUTERNAME.".log"; 
print "$complog"; 

예상되는 출력은 다음과 같습니다.

CH-B7G33.log 

하지만 내가 잘못 나온 것은 인쇄 된 것입니다.

.logB7G33 

코드에 문제가 있습니까? 제발 저를 도와주세요, 저는 펄 초급자이고 내 영어로 유감입니다.

+2

1) 귀하의 예는 유효한 Perl이 아닙니다. 첫 번째 줄의 정확한 위치에 세미콜론을 추가하십시오. 2) 이해할 수있을 때까지 단순화 해보십시오. 예를 들어'print $ COMPUTERNAME;'을 두 ​​번째 줄에 넣고 그 것이 작동하는지 확인하십시오. – Mikel

+0

수정 해 주셔서 감사합니다. – quinekxi

+0

동일한 문제에 직면 해 있습니다. 어떻게 처리 했습니까? – Atieh

답변

11

시스템 호출의 반환 값의 마지막에 \r이 포함되어 있습니다. chomp은 지워지지 않습니다. 그래서 당신의 문자열은 CH-B7G33\r.log처럼 보입니다.이 때 터미널에 CH-B7G33이 표시되고 다시 커서를 줄의 처음으로 옮기고 문자를 덮어 쓰는 .log을 표시하면 잘못된 출력으로 이어집니다.

대체를 사용하면 잘 작동하며, \r\n 줄 끝 (및 여기에 설명 된 다른 후행 공백)을 모두 처리합니다.

(my $COMPUTER_NAME = `hostname`) =~ s/\s+$//; 
+0

나는 이와 비슷한 해결책을 발견했습니다. 감사! :) – quinekxi

9
use Sys::Hostname; 
print hostname . ".log"; 

chomp 할 필요가 없습니다 또는 당신이 원하는 않는 멋진 라이브러리 함수있을 때 쉘에 탈출.

+0

필자는 이미이 도구를 시도했지만 Perl이 cygwin에서 실행중인 다른 컴퓨터에서 시도했습니다. 나는이 모듈을 설치해야한다고 생각하는 실행을 할 수 없다. – quinekxi

+2

설치할 필요가 없습니다. Perl 핵심 배포판의 일부입니다. '$ corelist Sys :: Hostname␤Sys :: Hostname이 perl 5로 처음 출시되었습니다. ' – daxim

+0

@quinekxi, cygwin에서 어떤 증상이 보이십니까? 오류 메시지가 있거나 혼란 스럽거나 잘못된 결과가 나옵니까? 그렇다면, 무엇? 'perl -c'는 cygwin에서 오류 추적을 생성합니까? –