[완료] perl에서, 한 변수의 값에 동적으로 의존하는 변수랄까... 이런 게 가능할까요?
글쓴이: raymundo / 작성시간: 금, 2007/03/02 - 9:20오후
이거 아무리 생각해도 말이 안 될 것 같긴 한데....
$str1 = "hello"; $str2 = $str1."world"; # 문제의 라인 print "[$str2]\n"; # $str2 = "helloworld"; $str1 = "bye!"; # $str1이 바뀌어봤자 print "[$str2]\n"; # $str2 는 여전히 "helloworld";
위는 뭐 너무도 당연한 건데...
두번째 print 문에서 "bye!world"가 출력되게 할 수 있을까요? str2를 변수가 아니라 함수를 쓰면야...
sub str2 { return $str1."world"; } $str1 = "hello"; print &str2()."\n"; # "helloworld" $str1 = "bye!"; print &str2()."\n"; # "bye!world"
이렇게는 물론 할 수 있겠지만, 제가 하려는 게 변수 하나의 값이 바뀌면 그에 따라 변수 열 개 정도가 와르르 바뀌어야 하는 데다가, (다들 뒤에 서로 다른 문자열이 붙는 형태), 그 열 개의 변수를 사용하는 모든 라인을 함수로 다시 바꿔주는 것도 좀 아니다 싶은게죠.
str2를 스칼라 변수로 사용하려는 미련을 버리고 레퍼런스 변수로 쓰려고 해도
$str1 = "hello"; $str2 = \$str; print "[$$str2]\n"; # $$str2 = "hello" $str1 = "bye!"; print "[$$str2]\n"; # $$str2 = "bye!"
이렇게까지는 할 수 있지만 뒤에 "world"라는 문자열을 붙이려면?? =.=??
불가능한 걸까요?
Forums:
tie를 쓰시면 됩니다.
$Myoungjin_JEON=@@=qw^rekcaH lreP rehtonA tsuJ^;$|++;{$i=$like=pop@@;unshift@@,$i;$~=18-length$i;print"\r[","~"x abs,(scalar reverse$i),"~"x($~-abs),"]"and select$good,$day,$mate,1/$~for 0..$~,-$~+1..-1;redo}
으음...
암호문 같군요 OTL
열심히 들여다보겠습니다. 감사합니다 ^^
좋은 하루 되세요!
Tie 이야기가 나온
Tie 이야기가 나온 김에 역시 정보 추가를 위해 몇가지 정리해둡니다. 제가 생각하는 tie는 내장 자료형에 대한 접근 방법이 내부적인 함수에 의해 처리된다고 가정할 때 그 작업을 오버라이딩하는 방법이라고 생각합니다. 아래는 native 하게 tie를 사용하기 위한 방법입니다. :-)
tie를 사용해 스칼라를 구현하는 클래스에서 제공해야 할 목록:
tie를 사용해 배열을 구현하는 클래스에서 제공해야 할 목록:
tie를 사용해 해쉬를 구현하는 클래스에서 제공해야 할 목록:
tie를 사용해 파일핸들을 구현하는 클래스에서 제공해야 할 목록:
이런 작업들이 번거롭다면! 펄은 객체지향을 완전히 지원하고 이러한 tie 작업을 위한 baseclass를 제공합니다. 이들 클래스를 상속받으면 간단하게 작업을 처리할 수 있습니다. CPAN이나 perldoc에서 아래 모듈들에 대해서도 한번 읽어 보시기 바랍니다. :-)
---------------------------
Smashing Watermelons~!!
Whatever Nevermind~!!
Kim Do-Hyoung Keedi
----
use perl;
Keedi Kim
또 다른 예제입니다.
주석이 충분한 것 같아서 따로 설명을 하지 않아도 될 것 같습니다. :-)
다음은 Tie를 사용하기 위한 예제 모듈입니다.
아래는 위의 모듈을 이용하여 tie를 사용해보는 것입니다. 주의점은 Tie로 넘길때 스칼라 변수를 레퍼런스로 넘겨야 하며, 포맷을 인자로 주시므로 원하는 형태로 변수들을 실시간으로 적용할 수 있습니다.
결과입니다. 흥미롭지요. :-)
---------------------------
Smashing Watermelons~!!
Whatever Nevermind~!!
Kim Do-Hyoung Keedi
----
use perl;
Keedi Kim
펄을 배우고 싶은
펄을 배우고 싶은 마음을 0으로 리셋하고,
펄에 대한 관심을 클리어하는 코드였습니다...
또한, 펄 코드는 모두 암호문이라는(헬로월드 빼고) 생각을 무한대로 증가시키고 있습니다...
------------------------------------------------------
[낡배밀] 낡은 리눅스 배포판을 밀어내야 한다고 생각합니다.
Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.
흠..
급하게 짜느라 그렇게 되었습니다.
펄이 워낙 유연해서 암호문처럼 짤 수도 아닐 수도 있습니다.
$Myoungjin_JEON=@@=qw^rekcaH lreP rehtonA tsuJ^;$|++;{$i=$like=pop@@;unshift@@,$i;$~=18-length$i;print"\r[","~"x abs,(scalar reverse$i),"~"x($~-abs),"]"and select$good,$day,$mate,1/$~for 0..$~,-$~+1..-1;redo}
흠~ 암호문이라~ C를
흠~ 암호문이라~ C를 모르는 사람이 보면 평범한 코드도 암호문 같겠죠.
타이(Tie)라는 개념이 쉬운 개념은 아닐텐고, 보통의 언어에서는 찾기 힘든 개념이죠.
Object Oriented Perl 에서 Damian Conway는 Tie를 이렇게 설명합니다.
우선 프로그래밍 언어나 컴파일러에 대해 어느정도 지식이 있으시다면 perl의 tie가 어떤식으로 동작하는지는 상상할 수 있으실 것입니다. 대부분의 경우 tie 없이도 프로그래밍을 할 수 있으며, 굳이 필요하다면 Raymundo님께서 언급하신 것처럼 중간에 하나의 과정을 더 거치면 된다는 것입니다. 그렇다면 perl의 tie가 하는 일이란 간단합니다. 중간의 거칠 과정을 일종의 내장함수와 내장함수를 사용하기 위한 템플릿을 적용해서 연결을 시키고 나면 그뒤로는 자동으로 연결이 되서 언어차원에서 해결을 해주겠다는 의미죠. 그러한 언어차원의 해결을 하기 위한 기본적인 API를 사용자가 지정한다는 것은 그만큼 언어의 동작에 대해 프로그래머가 개입할 수 있는 여지를 남겨 놓는 것입니다. 그리고 js님의 코드는 이것을 편하게 도와주는 Perl 모듈을 사용하신 것이구요.
어렵다면 쓰지 않으면 그만일 기능이지만, Perl을 모르시는 단계에서 해당 기능의 수준 정도에 대해 저정도의 인터페이스가 어렵게 느껴지시는 것은 그럴법도 하지만, 단지 advanced한 기능때문에 Perl에 대한 흥미가 완전히 떨어지셨다는 것은... 흠... 안타까운 일이군요. :-)
---------------------------
Smashing Watermelons~!!
Whatever Nevermind~!!
Kim Do-Hyoung Keedi
----
use perl;
Keedi Kim
함수 형태를
함수 형태를 사용하실때는 간단한 표기법이 있습니다.
물론 $str1은 함수를 쓰지 않아도 됩니다.
다른 방법으로 cookbook에 나오는 방법은
여러단계로 변수를 포함할때는 단계+1 보다 많은 "e"를 붙여주시거나 루프를 돌리면 됩니다.
저라면
$str2 = '$str1 world'; 보다는
과 같은 방법을 쓰겠습니다.
물론 간단한 함수를 하나 만들어쓰겠지요.
동작은.. 장담 못합니다. 돌려보고 말해주세요.^^
이정도면
이정도면 정규표현식을 빼고는 별로 암호같지는 않을 것 같습니다.
어떤가요?
일단 no strict 'refs'를
일단 no strict 'refs'를 사용하지 않으면 컴파일 에러가 나네요.
그리고 붙여도 안 돌아가는 것 같네요. ^^;
---------------------------
Smashing Watermelons~!!
Whatever Nevermind~!!
Kim Do-Hyoung Keedi
----
use perl;
Keedi Kim
몇번째 예제가
몇번째 예제가 안되는 걸까요?
cookbook의 방법은
cookbook의 방법은 됩니다. pung96님이 소개해주신 cookbook의 방법을 이용해서 예제를 한번 올려보았습니다.(http://kldp.org/node/79251#comment-375645) 그런데 새롭게 응용하신 방법이 잘 동작하지 않네요. :-)
---------------------------
Smashing Watermelons~!!
Whatever Nevermind~!!
Kim Do-Hyoung Keedi
----
use perl;
Keedi Kim
no strict 'refs'가
no strict 'refs'가 필요한건 s/%([^%]+)%/${$1}/ge 에서 ${$1} 이 심볼릭 레퍼런스로 작동하기 때문입니다.
이것을 해결하려면 tie예제에서 사용하신것 처럼 파라미터를 %$var%형태로 하셔도 되고 %var% 을 쓰시려면
s/%([^%]+)%/"\$".$1/gee; 처럼 쓰시면 됩니다.
그리고 다시보니 제가 만든 예제는 $str2자체를 바꿔버려서 제대로 작동하지 않는군요.
다시 만든 완전한 코드를 올리면
잘 동작합니다~
잘 동작합니다~ 호오... 요 e 옵션이 재미있네요... :-)
저는 사실 코드에 %가 있어서(%$str2%, 제가 쓴것도 그렇지만...저는 혹시나 걱정되서 작은 따옴표로 포맷을 정의했답니다.) 해쉬로 해석하지 않을까 걱정했는데... 제가 생각했던 것보다 펄 인터프리터가 훨씬 더 똑똑한 것 같습니다. ^^
---------------------------
Smashing Watermelons~!!
Whatever Nevermind~!!
Kim Do-Hyoung Keedi
----
use perl;
Keedi Kim
참고로 이런것도 가능합니다.
나날이 perl에 관한 질답이 많아지고 그 수준이 높아져가는걸 보니 perl사용자로서 기분이 좋습니다.
이건 일종의 TIP인데 ( 쓸 일이 있을지 모르겠지만 )이런것도 가능합니다.
어떤 변수들이 존재한다면 해당 변수명을 동적으로 만들어서 다른 변수에 할당해서 사용하는 방법입니다.
그리고 이건 보너스인데..
Oreilly 의 Learning Perl, Intermediated Perl 책 시리즈 다음으로 기획되고 있는 책으로
온라인으로 그 내용이 공개되어 피드백을 받으며 계속 보완/완성되어가고 있습니다.
Mastering Perl
http://www252.pair.com/comdog/mastering_perl/Chapters/
고급 Perl 테크닉에 목마르셨던 분들이 보시면 재미있을겁니다.
tie ... 놀랍군요!!!
처음에 jg님이 답글 달아 주신지 두 달이 지나서야 이제 이해했습니다! perldoc -f tie 했다가 제대로 읽어볼 엄두도 못내고 접었었는데 =.=;;;, 오늘에서야 온라인에 공개된 "beginning perl"의 11장 OOP 끝에 tie가 언급되어 있길래 찬찬히 읽어봤답니다. ^_^
이해가 되고 나니 그 다음은 놀랄 차례더군요. "이런게 가능하다니!" @.@;
일단 처음에 제기되었던 문제를 다시 적어보면... (원글이 너무 위에 있어서 스크롤하기 귀찮으실까봐)
일단 제가 언급한 "str2를 함수를 사용하는 방법"이나 다른 분들이 댓글에 달아주신 방법(eval이나 정규표현식의 치환을 써서 동적으로 바꾸기)의 경우는, 기존 코드에서 $str2를 읽는 모든 곳을 찾아서 다 고쳐주어야 (함수로 바꾸든지, 읽기 직전에 eval 또는 치환을 하든지) 하는 불편이 있겠고요.
tie를 써서 만들어보았습니다. 그리고 최대한 주석도 제가 이해하는 한도에서 자세히 달아보았습니다.
이제 이걸 사용하는 예는~
덕분에 정말 좋은 거 알았습니다. (뭐 막상 쓸 일이 얼마나 있을지는 모르겠지만) ^_^ 조언 주신 분들 모두 감사드립니다!
좋은 하루 되세요!
댓글 달기