티스토리 뷰
라인 인풋
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 (<>);
따라서 커맨드 라인에서 어떤 것을 읽어 들여서 처리하는 간단한 펄 프로그램을 만들 때는 <>
를 사용합니다.
이처럼 실제 유닉스 커맨드들을 펄을 이용해서 구현해 볼 수 있습니다.
이번 시간에 한 내용들은 기초적이지만은 아주 중요한 내용입니다. 특히 사용자 입력처리에 관한 내용은 잘 이해를 해두세요.
'프로그래밍' 카테고리의 다른 글
메타 태그 (Meta Tag) (0) | 2020.07.03 |
---|---|
프로그래밍 언어의 간단한 역사 (0) | 2020.07.02 |
펄(Perl)의 변수와 스칼라(scalar), 문자열 처리 (0) | 2020.06.30 |
펄(Perl) 프로그래밍 언어 개괄 (2) | 2020.06.24 |
IP 주소 (ip address) 개괄 (0) | 2020.06.20 |