[PERL] STDIN 으로 받을때, enter 키말고 다른키 기준으로 받을수 없을까요??

jekai의 이미지

안녕하세요 프로그래밍하다가 갑자기 궁금한 점이 생겨서 질문드립니다.

보통 C 에서 scanf 나 perl 에서 이나,, 문자들을 enter 키를 입력한시점까지 문자들을 받죠,,

그런데, 이 키를 다른 키로 바꿀려면 어떻게 해야죠???

보통 bash 나 , tcsh 같은경우 tab 키를 누르면 file list 가 나오는것 처럼요 ㅎㅎ

그리고 perl 하다가 궁금한게 또 있는데, perl 에서는 탭키나, capslock 키 같은 문자를 어떻게 인식하죠??

C에서는 ASCII 코드가 있는데.. 흠..

그럼 아시는 분 답변 부탁드립니다(__)

suns1997의 이미지

저도 펄을 아직 서투르지만 궁금해서 찾아봤습니다.
정확히는 모르겠지만 ^^; 리눅스에서 터미널의 기본적인 인터페이스는 POSIX를 따릅니다.
그래서 POSIX쪽을 뒤져 보니까 나오네요.
정확히 원하시는 기능은 아니지만 그래도 유사하기에 코드를 올려봅니다.
조금 응용하시면 원하는 기능도 얻을수 있을듯 해요..
참고로 펄쿡북에서 발췌 했습니다.

터미널에서만 됩니다. 다른 도스창이나 Emacs쉘모드는 어떻게 될지는 모르겠네요..

백스페이스 기능을 '#'로 바꾸고 Ctrl-U를 '@'로 바꿉니다.

#!/usr/bin/perl
 
use POSIX qw(:termios_h);
$term = POSIX::Termios->new;
$term->getattr(fileno(STDIN));
 
$erase = $term->getcc(VERASE);
$kill  = $term->getcc(VKILL);
printf "Erase is character %d, %s\n", $erase, uncontrol(chr($erase));
printf "Kill is character %d, %s\n", $kill, uncontrol(chr($kill));
 
$term->setcc(VERASE,ord('#'));
$term->setcc(VKILL, ord('@'));
$term->setattr(1,TCSANOW);
 
print("erase is #, kill is @; type something: ");
$line = <STDIN>;
print "You typed: $line";
 
$term->setcc(VERASE,$erase);
$term->setcc(VKILL,$kill);
$term->setcc(1,TCSANOW);
 
sub uncontrol{
  local $_ = shift;
 
  s/([\200-\377])/sprintf("M-%c",ord($1) & 0177)/eg;
  s/([\0-\37\177])/sprintf("^%c",ord($1) ^ 0100)/eg;
  return $_;
}

keedi의 이미지

CPAN 에 Term::Readline 과 Term::Readline::* 류의 모듈이 바로 원하는 것일 것입니다.
해당 모듈 설치하시고 문서화 함께 GNU의 Readline 라이브러리 문서와 같이 참조하시면
편하게 터미널에서 키 바인딩 처리를 하실 수 있을 겁니다. :-)

---------------------------
Smashing Watermelons~!!
Whatever Nevermind~!!

Keedi Kim

----
use perl;

Keedi Kim

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.