티스토리 뷰

라인 인풋

2001-10-3

 

이번 글에서는 펄을 이용한 사용자 입력 처리를 알아 보겠습니다.

사용자 입력 처리

"line input operator"라는 것이 있습니다.

 

<>

 

모양이 다이아몬드를 닮아서 "diamond operator"라고도 합니다. 또는 "angle operator"라고도 합니다.

다이아몬드 연산자는 "line input operator"라는 이름처럼 행을 입력받는(line input) 연산자입니다. 다이아몬드 사이에 파일핸들(file handle)을 넣어 주면 파일을 한 줄 읽어 들입니다. 일단은 어떤 것을 한 줄 읽어 들이는 기능을 한다고 알고 있으면 됩니다.

 

그 다음으로, STDIN이 있습니다. 이것은 "Standard Input"의 약자로 '표준입력'이라는 것입니다. 이것은 또 많은 내용이 있는 것입니다만은 우선은 '키보드로 입력한 것'을 가리킨다고 알면 됩니다. 표준 입력과 반대되는 것은 "Standard Output"입니다. STDOUT이라고 쓰는 것으로 모니터 화면을 가리킵니다. 키보드로 입력하고 모니터에 출력하는 게 '표준'입니다.

 

그러면,

 

<STDIN>

 

이라고 하면 어떻게 될까요? 키보드로 입력한 것을 한 줄 읽어 들이는 게 됩니다.

그러므로 다음의 코드는,

 

$line = <STDIN>;
print $line;

 

그냥 기다리고 있다가 키보드로 무엇인가 입력하면 그대로 다시 출력합니다.

 

그런데 도대체 '한 줄'이란 것이 뭘 의미할까요?

 

펄에서 '한 줄'은 개행문자(new line character; \n)까지를 의미합니다. 위 코드를 실행한 다음 키보드로 abcdefgh라고 입력한 뒤 엔터키를 눌렀다고 해봅시다. 이 경우 키보드로 입력한 문자열은 abcdefgh\n가 될 것입니다. 엔터 키에 의해서 줄바꿈이 되니까 \n이 붙었습니다. \n이 등장하면 펄은 이제 한 줄이 다 입력되었구나라고 생각하고 <STDIN>으로 읽어들이는 것을 중단합니다. 이 부분은 무척 중요합니다.

 

따라서 위의 코드를 실행하면, $line이라는 변수에는 사용자가 입력한 문자열 끝에 \n이 달린 것이 담기므로,

사용자 입력 문자열을 출력한 다음 한 줄을 띄우고 커서가 깜박이게 됩니다. 이제 이 개행문자 \n을 어떻게 처리해야 할 지 얘기할 수 있습니다.

chomp 연산자

사용자가 키보드로 뭔가를 입력했을 때 입력한 내용의 끝에는 항상 \n이 달려있습니다. 키보드로 입력하는 한 엔터키를 눌러야만 입력이 되기 때문입니다. 그런데 우리가 관심을 갖고 있는 것은 \n가 아니라 그 앞에 있는 내용물이므로 \n을 없애주는 연산자가 필요합니다. 바로 그 기능을 chomp 연산자가 합니다. 

 

$line = "abcd\n";
chomp ($line);

 

첫 줄에서는 $line이라는 스케일라 변수에 abcd와 함께 개행문자를 할당했습니다. 작은 따옴표를 쓰지 않고 큰 따옴표를 썼다는 것을 주목하세요. 작은 따옴표를 쓴 경우엔 개행문자가 아니라 a,b,c,d,\,n 이라는 6개의 문자가 담깁니다. 그 다음 줄에서는 $line 변수에 담긴 문자열에서 \n만 없앱니다. 이제 $line에는 "abcd"만 남아있습니다. 다음의 경우엔 어떻게 되겠습니까?

 

$line = "abcd\n";
$question = chomp($line);
print $question;

 

과연 $question변수에는 무엇이 담길까요? 예상과는 다르죠? $question에는 "abcd"가 담기는게 아니라 1이 담깁니다. 갑자기 1은 또 무엇일까요?

 

chomp 연산자는 \n을 떼어내는 기능을 한다고 했습니다. 그러면 chomp의 리턴값은 무엇일까요?

 

chomp는 함수가 아니라 연산자이기 때문에 그 연산이 성공적으로 시행되면 1, 그렇지 않으면 0을 리턴합니다. chomp는 함수가 아닙니다.


\n을 성공적으로 떼어냈으면 1을 리턴합니다.
\n을 떼어내지 못했으면 0을 리턴합니다.
\n을 떼어낸 값을 반환하는 것이 아닙니다.

 

따라서 \n을 떼어낸 값 자체를 갖고 싶다고 이를 별도의 변수에 담을 필요가 없습니다. 위의 예를 보자면,

 

chomp($line);

 

만으로 $line에는 abcd만 들어있게 됩니다.

 

만약 작은 따옴표를 이용해서 실행하면 어떻게 될까요?

 

$line = 'abcd\n';
$question = chomp($line);
print $question;

 

0이 출력되는 것을 알 수 있습니다.
왜냐하면 작은 따옴표 내에서는 \n이 개행문자로 취급되지 않아서 chomp()에 의해서 개행문자가 제거되지 않기 때문입니다.

 

사용자가 키보드로 입력한 값을 \n없이 읽어들이는 방법은 결국 다음과 같이 됩니다.

 

chomp ($line = <STDIN>);

 

매우 많이 쓰이는 것이므로 문장째로 반드시 외워두는 게 좋습니다.

 

그리고 <>처럼 사이에 아무것도 넣지 않는 경우 중간에 STDIN이 들어있는 것처럼 키보드로 무엇인가를 입력하도록 기다립니다.

 

다음 펄 프로그램은 커맨드라인의 echo 명령어와 똑같은 기능을 합니다.

 

#!/usr/bin/perl
print while (<>);

 

따라서 커맨드 라인에서 어떤 것을 읽어 들여서 처리하는 간단한 펄 프로그램을 만들 때는 <>를 사용합니다.

이처럼 실제 유닉스 커맨드들을 펄을 이용해서 구현해 볼 수 있습니다.

 

이번 시간에 한 내용들은 기초적이지만은 아주 중요한 내용입니다. 특히 사용자 입력처리에 관한 내용은 잘 이해를 해두세요.

반응형
댓글