[완료] perl에서, 한 변수의 값에 동적으로 의존하는 변수랄까... 이런 게 가능할까요?

raymundo의 이미지

이거 아무리 생각해도 말이 안 될 것 같긴 한데....

$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"라는 문자열을 붙이려면?? =.=??

불가능한 걸까요?

jg의 이미지

#!/usr/bin/env perl
package TemplateVar;
 
use warnings;
use strict;
use Tie::Scalar;
use base 'Tie::Scalar';
 
sub TIESCALAR
{
    my $class = shift;
    $_[1] = '%s' unless defined ( $_[1] );
    bless { 'keyvar' => $_[0], 'template' => $_[1] }, $class;
}
 
sub FETCH
{
    my $this = shift;
    return sprintf ( $$this{template}, ${$$this{keyvar}} );
}
 
package main;
 
my ( $key, $var1, $var2 );
my %hash = (
    'var1' => 'this is var1 : %s',
    'var2' => 'this is var2 : %s',
);
 
while ( my ( $varname, $template ) = each %hash )
{
    eval qq{ tie \$$varname, 'TemplateVar', \\\$key, '$template' };
}
 
$key = 'test';
print $var1."\n";
$key = 'changed variable';
print $var2."\n";

$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}

raymundo의 이미지

암호문 같군요 OTL

열심히 들여다보겠습니다. 감사합니다 ^^

좋은 하루 되세요!

keedi의 이미지

Tie 이야기가 나온 김에 역시 정보 추가를 위해 몇가지 정리해둡니다. 제가 생각하는 tie는 내장 자료형에 대한 접근 방법이 내부적인 함수에 의해 처리된다고 가정할 때 그 작업을 오버라이딩하는 방법이라고 생각합니다. 아래는 native 하게 tie를 사용하기 위한 방법입니다. :-)

tie를 사용해 스칼라를 구현하는 클래스에서 제공해야 할 목록:

    TIESCALAR classname, LIST
    FETCH this,
    STORE this, value
    DESTROY this
    UNTIE this

tie를 사용해 배열을 구현하는 클래스에서 제공해야 할 목록:

    TIEARRAY classname, LIST
    FETCH this, key
    STORE this, key, value
    FETCHSIZE this
    STORESIZE this, count
    CLEAR this
    PUSH this, LIST
    POP this
    SHIFT this
    UNSHIFT this, LIST
    SPLICE this, offset, length, LIST
    EXTEND this, count
    DESTROY this
    UNTIE this

tie를 사용해 해쉬를 구현하는 클래스에서 제공해야 할 목록:

    TIEHASH classname, LIST
    FETCH this, key
    STORE this, key, value
    DELETE this, key
    CLEAR this
    EXISTS this, key
    FIRSTKEY this
    NEXTKEY this, lastkey
    SCALAR this
    DESTROY this
    UNTIE this

tie를 사용해 파일핸들을 구현하는 클래스에서 제공해야 할 목록:

    TIEHANDLE classname, LIST
    READ this, scalar, length, offset
    READLINE this
    GETC this
    WRITE this, scalar, length, offset
    PRINT this, LIST
    PRINTF this, format, LIST
    BINMODE this
    EOF this
    FILENO this
    SEEK this, position, whence
    TELL this
    OPEN this, mode, LIST
    CLOSE this
    DESTROY this
    UNTIE this

이런 작업들이 번거롭다면! 펄은 객체지향을 완전히 지원하고 이러한 tie 작업을 위한 baseclass를 제공합니다. 이들 클래스를 상속받으면 간단하게 작업을 처리할 수 있습니다. CPAN이나 perldoc에서 아래 모듈들에 대해서도 한번 읽어 보시기 바랍니다. :-)

Quote:

Tie::Scalar, Tie::Array, Tie::Hash, Tie::Handle.

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

Kim Do-Hyoung Keedi

----
use perl;

Keedi Kim

keedi의 이미지

주석이 충분한 것 같아서 따로 설명을 하지 않아도 될 것 같습니다. :-)

다음은 Tie를 사용하기 위한 예제 모듈입니다.

#
#===============================================================================
#
#         FILE:  MyScalar.pm
#
#  DESCRIPTION:  Scalar를 타이하기 위한 모듈
#
#        FILES:  ---
#         BUGS:  ---
#        NOTES:  ---
#       AUTHOR:   (), <>
#      COMPANY:  
#      VERSION:  1.0
#      CREATED:  2007년 03월 05일 11시 09분 32초 KST
#     REVISION:  ---
#===============================================================================
 
package MyScalar;
 
use strict;
use warnings;
 
use Tie::Scalar;
our @ISA = qw(Tie::Scalar);
 
# Scalar tie에 대한 생성자
sub TIESCALAR {
    my $class  = shift;
    my $format = shift;
    my @args   = @_;
    my $object =  {
        value       => '',
        format      => $format,
        arguments   => \@args,
    };
 
    bless $object, $class;
}
 
# 읽기 전용 액세스 가로채기
sub FETCH {
    my $self = shift;
 
    # 범용적 포맷에 맞게 적용
    #   - pung96님의 방법 응용해 보았습니다.
    #   - 굳이 이렇게 할 필요는 없겠지요. :-)
    #   - 대신 포맷에 맞게 출력해주니 범용적입니다.
    #   - 포맷과 파라미터 개수에 대한 에러체크는 뺐습니다.
 
    # 포맷 적용을 위한 네임 영역 생성
    my $original_value = $$self{value};
    my @arg = map { $$_ } @{$$self{arguments}};
 
    # 포맷에 실제 네임 영역에 해당하는 값들을 치환
    my $apply_format = $$self{format};
    $apply_format =~ s/\%(.+?)\%/$1/gee;
 
    return $apply_format;
}
 
# 쓰기 전용 액세스 가로채기
sub STORE {
    my ($self, $newval) = @_;
    $$self{value} = $newval;
}
 
1;

아래는 위의 모듈을 이용하여 tie를 사용해보는 것입니다. 주의점은 Tie로 넘길때 스칼라 변수를 레퍼런스로 넘겨야 하며, 포맷을 인자로 주시므로 원하는 형태로 변수들을 실시간으로 적용할 수 있습니다.

#!/usr/bin/perl 
#===============================================================================
#
#         FILE:  tie_simple.pl
#
#        USAGE:  ./tie_simple.pl 
#
#  DESCRIPTION:  scalar를 tie하는 간단한 예제
#
#      OPTIONS:  ---
# REQUIREMENTS:  ---
#         BUGS:  ---
#        NOTES:  ---
#       AUTHOR:   (), <>
#      COMPANY:  
#      VERSION:  1.0
#      CREATED:  2007년 03월 05일 11시 13분 39초 KST
#     REVISION:  ---
#===============================================================================
 
use strict;
use warnings;
 
# 스칼라 tie를 위한 나만의 API
use MyScalar;
 
my $test_index;
my $test_prefix;
my $test_postfix;
 
# 스칼라 tie 적용
my $message;
tie(
    $message,                                               # tie할 변수
    'MyScalar',                                             # tie적용 클래스
    'No. %$arg[2]%: %$arg[0]%_%$original_value%_%$arg[1]%',   # 구현자 마음: format argument
    \$test_prefix,                                          # 구현자 마음: $arg[0]
    \$test_postfix,                                         # 구현자 마음: $arg[1]
    \$test_index,                                           # 구현자 마음: $arg[1]
);
 
# 타이로 인한 변화를 살펴보기, $message는 변화시키지 않음!
$test_index   = 1;
$test_prefix  = 'perlmania';
$test_postfix = 'BBS';
check_variable($test_index, $test_prefix, $test_postfix, $message);
 
# 타이로 인한 변화를 살펴보기, $message는 변화시키지 않음!
$test_index   = 2;
$test_prefix  = 'perlmania';
$test_postfix = 'mod_perl';
check_variable($test_index, $test_prefix, $test_postfix, $message);
 
# 타이로 인한 변화를 살펴보기, $message만 변화
$message      = "Tie 테스트 입니다.";
check_variable($test_index, $test_prefix, $test_postfix, $message);
 
# 타이로 인한 변화를 살펴보기, 모두 변화
$test_index   = 100;
$test_prefix  = 'KLDP';
$test_postfix = 'Programming Language';
$message      = "Linux & Perl";
check_variable($test_index, $test_prefix, $test_postfix, $message);
 
# 타이로 인한 변화를 살펴보기, $message만 변화
$message      = "이것이 바로 Tie 입니다.";
check_variable($test_index, $test_prefix, $test_postfix, $message);
 
# 간단한 변수 출력을 위한 함수
sub check_variable {
    my @variables = @_;
 
    for my $variable ( @variables ) {
        print "[$variable]\n";
    }
    print "\n";
}

결과입니다. 흥미롭지요. :-)

[1]
[perlmania]
[BBS]
[No. 1: perlmania__BBS]
 
[2]
[perlmania]
[mod_perl]
[No. 2: perlmania__mod_perl]
 
[2]
[perlmania]
[mod_perl]
[No. 2: perlmania_Tie 테스트 입니다._mod_perl]
 
[100]
[KLDP]
[Programming Language]
[No. 100: KLDP_Linux & Perl_Programming Language]
 
[100]
[KLDP]
[Programming Language]
[No. 100: KLDP_이것이 바로 Tie 입니다._Programming Language]

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

Kim Do-Hyoung Keedi

----
use perl;

Keedi Kim

cppig1995의 이미지

펄을 배우고 싶은 마음을 0으로 리셋하고,
펄에 대한 관심을 클리어하는 코드였습니다...
또한, 펄 코드는 모두 암호문이라는(헬로월드 빼고) 생각을 무한대로 증가시키고 있습니다...
------------------------------------------------------
[낡배밀] 낡은 리눅스 배포판을 밀어내야 한다고 생각합니다.

Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.

jg의 이미지

급하게 짜느라 그렇게 되었습니다.
펄이 워낙 유연해서 암호문처럼 짤 수도 아닐 수도 있습니다.

$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}

keedi의 이미지

흠~ 암호문이라~ C를 모르는 사람이 보면 평범한 코드도 암호문 같겠죠.
타이(Tie)라는 개념이 쉬운 개념은 아닐텐고, 보통의 언어에서는 찾기 힘든 개념이죠.

Object Oriented Perl 에서 Damian Conway는 Tie를 이렇게 설명합니다.

Quote:

내장 데이터 타입을 제공하는 대부분의 언어에서 데이터 타입들의 동작은 고정되어 있어서 마치 “나를 사랑해줘. 나의 내장된 의미들을 사용해줘!"라고 말하는 것 같다. Perl은 이러한 언어의 파시즘을 거부하고 스칼라, 배열, 해쉬, 파일핸들과 같은 기본적인 데이터 타입의 동작과 구현을 바꿀 수 있게 한다. 이와 같은 자유를 가능하게 하는 것은 내장된 함수 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

pung96의 이미지

함수 형태를 사용하실때는 간단한 표기법이 있습니다.

$str1 = sub{"hello"};
$str2 = sub{&$str1."world"};
print &$str2."\n"; 
 
$str1 = sub{"bye"};
print &$str2."\n";

물론 $str1은 함수를 쓰지 않아도 됩니다.

다른 방법으로 cookbook에 나오는 방법은

$str1 = "hello";
$str2 = '$str1 world';
$str2 =~ s/(\$\w+)/$1/gee;
print $str2."\n";

여러단계로 변수를 포함할때는 단계+1 보다 많은 "e"를 붙여주시거나 루프를 돌리면 됩니다.
저라면
$str2 = '$str1 world'; 보다는
$str2 = "%str1% world";
$str2 =~ s/%([^%]+)%/${$1}/ge; # 위 방식보다 e가 하나 적습니다.
print $str2."\n";

과 같은 방법을 쓰겠습니다.
물론 간단한 함수를 하나 만들어쓰겠지요.

동작은.. 장담 못합니다. 돌려보고 말해주세요.^^

pung96의 이미지

이정도면 정규표현식을 빼고는 별로 암호같지는 않을 것 같습니다.
어떤가요?

keedi의 이미지

일단 no strict 'refs'를 사용하지 않으면 컴파일 에러가 나네요.
그리고 붙여도 안 돌아가는 것 같네요. ^^;

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

Kim Do-Hyoung Keedi

----
use perl;

Keedi Kim

pung96의 이미지

몇번째 예제가 안되는 걸까요?

keedi의 이미지

cookbook의 방법은 됩니다. pung96님이 소개해주신 cookbook의 방법을 이용해서 예제를 한번 올려보았습니다.(http://kldp.org/node/79251#comment-375645) 그런데 새롭게 응용하신 방법이 잘 동작하지 않네요. :-)
---------------------------
Smashing Watermelons~!!
Whatever Nevermind~!!

Kim Do-Hyoung Keedi

----
use perl;

Keedi Kim

pung96의 이미지

no strict 'refs'가 필요한건 s/%([^%]+)%/${$1}/ge 에서 ${$1} 이 심볼릭 레퍼런스로 작동하기 때문입니다.
이것을 해결하려면 tie예제에서 사용하신것 처럼 파라미터를 %$var%형태로 하셔도 되고 %var% 을 쓰시려면
s/%([^%]+)%/"\$".$1/gee; 처럼 쓰시면 됩니다.

그리고 다시보니 제가 만든 예제는 $str2자체를 바꿔버려서 제대로 작동하지 않는군요.
다시 만든 완전한 코드를 올리면

sub parsevar {
    my $var = shift;
    1 while $var=~s/%([^%]+)%/"\$".$1/gee;
    return $var;
}
 
$str1 = "Hello";
$str2 = "%str1% World";
print parsevar($str2)."\n";
$str1 = "Test";
print parsevar($str2)."\n";

keedi의 이미지

잘 동작합니다~ 호오... 요 e 옵션이 재미있네요... :-)

저는 사실 코드에 %가 있어서(%$str2%, 제가 쓴것도 그렇지만...저는 혹시나 걱정되서 작은 따옴표로 포맷을 정의했답니다.) 해쉬로 해석하지 않을까 걱정했는데... 제가 생각했던 것보다 펄 인터프리터가 훨씬 더 똑똑한 것 같습니다. ^^

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

Kim Do-Hyoung Keedi

----
use perl;

Keedi Kim

aero의 이미지

나날이 perl에 관한 질답이 많아지고 그 수준이 높아져가는걸 보니 perl사용자로서 기분이 좋습니다.
이건 일종의 TIP인데 ( 쓸 일이 있을지 모르겠지만 )이런것도 가능합니다.

어떤 변수들이 존재한다면 해당 변수명을 동적으로 만들어서 다른 변수에 할당해서 사용하는 방법입니다.

#!/usr/bin/env perl
use strict;
 
my $str_first="hello";
my $str_second="hi";
 
my $suffix='first';
my $str=eval('$str_'.$suffix);
print "$str\n";
$suffix='second';
$str=eval('$str_'.$suffix);
print "$str\n";

그리고 이건 보너스인데..
Oreilly 의 Learning Perl, Intermediated Perl 책 시리즈 다음으로 기획되고 있는 책으로
온라인으로 그 내용이 공개되어 피드백을 받으며 계속 보완/완성되어가고 있습니다.

Mastering Perl
http://www252.pair.com/comdog/mastering_perl/Chapters/
고급 Perl 테크닉에 목마르셨던 분들이 보시면 재미있을겁니다.

raymundo의 이미지

처음에 jg님이 답글 달아 주신지 두 달이 지나서야 이제 이해했습니다! perldoc -f tie 했다가 제대로 읽어볼 엄두도 못내고 접었었는데 =.=;;;, 오늘에서야 온라인에 공개된 "beginning perl"의 11장 OOP 끝에 tie가 언급되어 있길래 찬찬히 읽어봤답니다. ^_^

이해가 되고 나니 그 다음은 놀랄 차례더군요. "이런게 가능하다니!" @.@;

일단 처음에 제기되었던 문제를 다시 적어보면... (원글이 너무 위에 있어서 스크롤하기 귀찮으실까봐)

$str1 = "hello";
$str2 = $str1."world";  # 문제의 라인. $str2는 $str1의 값 뒤에 "world"를 붙이고 싶다.
print "[$str2]\n";      # $str2 = "helloworld";
 
$str1 = "bye!";         # $str1이 바뀌어봤자
print "[$str2]\n";      # $str2 는 여전히 "helloworld";
 
# 문제 - $str1이 바뀌면 $str2도 바뀌게 하고 싶음. 즉 마지막 라인에서 $str2의 값은 "bye!world"

일단 제가 언급한 "str2를 함수를 사용하는 방법"이나 다른 분들이 댓글에 달아주신 방법(eval이나 정규표현식의 치환을 써서 동적으로 바꾸기)의 경우는, 기존 코드에서 $str2를 읽는 모든 곳을 찾아서 다 고쳐주어야 (함수로 바꾸든지, 읽기 직전에 eval 또는 치환을 하든지) 하는 불편이 있겠고요.

tie를 써서 만들어보았습니다. 그리고 최대한 주석도 제가 이해하는 한도에서 자세히 달아보았습니다.

#### $str2(또는 아무 스칼라 변수라도)를 바인드하기 위한 FullString 클래스
package FullString;              # FullString 이라는 패키지
 
use Tie::Scalar;                 # Tie::Scalar 모듈을 읽어온다.
our @ISA = qw(Tie::Scalar);      # Tie::Scalar 클래스를 상속받음.
 
 
# tie $str2, 'FullString', \$str1, "world"; 라고 하면 이 TIESCALAR가 불린다.
 
sub TIESCALAR {
    my $class = shift;        # 첫번째 인자는 'FullString'
    my $prefix_ref = shift;   # 두번째 인자는 $str1의 레퍼런스
    my $body = shift;         # 세번째 인자는 "world"
 
    my @realdata = ($prefix_ref, $body);  # ( $str1의 레퍼런스, "world" ) 라는 배열이 내가 저장하고자 하는 자료구조
 
    return bless \@realdata, $class;      # 이 배열의 레퍼런스를 FullString 클래스의 오브젝트라고 지정하고 리턴
}
 
 
# $str2 의 값을 읽을 때는 이 FETCH가 불린다
# 예를 들어 print $str2;
 
sub FETCH {
    my $self = shift;    # 첫번째 인자로 넘어온 게 $str2에 바인드된... 바로 저 배열의 레퍼런스!
 
    # 배열의 첫번째 원소 $self->[0]에 들어 있는 것은 $str1의 레퍼런스이므로, dereference하면 $str1의 값
     # 두번째 원소 $self->[1]에 들어 있는 것은 "world"
 
    return ${$self->[0]} . $self->[1];  # 결과적으로, "$str1에 들어있는 값"과 "world"를 합친 문자열 반환
}
 
 
# $str2에 어떤 값을 할당할 때 자동으로 불리는 STORE
 
# STORE는 사실 이 경우 없어도 되는데, 이왕 tie 쓰는 법을 테스트하는 김에 :-)
# $str2 = "LINUX!";  와 같이 $str2의 값을 나중에라도 바꾸면
# $str2는 $str1의 값 뒤에 "LINUX!"가 붙는 형태가 될 수 있도록 함
sub STORE {
    my $self = shift;       # 역시 첫번째 인자는 배열의 레퍼런스
    my $new_body = shift;   # 두번째 인자는 저 할당문의 등호 우측의 값
 
    $self->[1] = $new_body; # 배열의 두번째 원소의 값을 교체
                                # 이 경우 전체 배열은 ( $str1의 레퍼런스, "LINUX!" )가 될 것임
}

이제 이걸 사용하는 예는~

my ($str1, $str2);
 
$str1 = "hello ";
# $str2 = $str1 . "world"; 이것 대신에
tie $str2, 'FullString', \$str1, "world";  # 이렇게 $str2와 FullString클래스를 바인드만 해주면
 
# 이하에 있는 $str2를 액세스하는 코드는 전혀 고칠 필요 없다!!! :-)
 
print "$str2\n";   # 이건 hello world
 
$str1 = "bye! ";   # $str1 을 바꾸면
print "$str2\n";   # 자동으로 bye! world 가 됨
 
$str2 = "LINUX!";  # 만일 $str2에 새로운 스트링을 할당하면?
print "$str2\n";   # 이건 bye! LINUX!

덕분에 정말 좋은 거 알았습니다. (뭐 막상 쓸 일이 얼마나 있을지는 모르겠지만) ^_^ 조언 주신 분들 모두 감사드립니다!

좋은 하루 되세요!

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.