//
=~
!~
$_ =~
m
\t
\n
\r
\033
\x1B
^
$
$string eq 'bert'
^...$
[...]
/yes/i
-
[-ab]
[ab-]
[a\-b]
//aa
[[주인장]] 보충: Kelvin Sign을 구글링해보니 유니코드 U+212A에 해당하고, 생김새는 "K"와 비슷하다[http://www.fileformat.info/info/unicode/char/212a/index.htm]. 이것이 /i 옵션을 주었을 때는 알파벳 'k'나 'K'에 매치된다. (Perl 5.8.8에서도 마찬가지임을 확인했음) Strawberry Perl 5.12에서 테스트: {{{#!vim perl use 5.012; $_ = chr(0x212A); # Kelvin Sign say "match /k/" if /k/; say "match /K/" if /K/; say "match /k/i" if /k/i; say "match /K/i" if /K/i; }}} {{{#!vim match /k/i match /K/i }}}
\d\s\w\D\S\W
\d
\w
[^\d\w]
[\D\W]
[^\w]
[\W]
\W
.
"\n"
dog
cat
\d\d
"20"
$1
$2
$3
$4
주인장 추가: 테스트 결과, 위의 예제에서 $4가 undef일 경우 $+는 $3에 대응된다. 다만 상황에 따라 매치 변수의 값이 빈 스트링 ""일 때도 있고 이 때는 $+도 이 변수에 대응된다. undef인 경우와 구분해야 함 추가로 작성해 본 예문 {{{#!vim perl $time = "12:34:56"; $time =~ /(\d\d):(\d\d):((\d)\d)/; 1 2 34 print "$1-$2-$3-$+-$^N"; # 12-34-56-5-56 }}}
주인장 추가: 이전 버전에서는 \1, \2 이런 식이었는데, Perl 문서에서부터 표기법이 이렇게 바뀌었다. \g{N} 형태 자체는 Perl 에서부터 생겼음[http://search.cpan.org/~flora/perl-5.14.2/pod/perl5100delta.pod]
\1
\2
\g{N}
\g{-2}
(\w+)
자동으로 부여되는 번호와 달리, 프로그래머가 이름을 붙이면 다음 두 가지 문제를 생각해 볼 수 있다. * 한 패턴 안에 동일한 이름의 캡처 그룹이 둘 이상 있으면 어떻게 되는가? * 이름이 붙은 그룹에도 번호가 붙는가? 이 두 사안에 대해서 프로그래밍 언어나 라이브러리에 따라 다르게 처리한다. 자세한 것은 [http://www.regular-expressions.info/named.html Regex Tutorial - Named Capturing Groups - Backreference Names] 참고. Perl의 경우는 Perldoc:perlre 에서 짧게 언급하고 있다. 첫번째 문제의 경우, 두번 이상 사용된 이름을 가리키는 백레퍼런스는, "정의된 그룹 중 가장 왼쪽에 있는 그룹"을 가리키게 된다. {{{#!vim perl 'abcd' =~ /(a)(?b)?(c)(?d)/; print "x[$+{x}]\n"; # "b" 'acd' =~ /(a)(?b)?(c)(?d)/; # 여기선 두번째 그룹이 매치가 안 되고, 해당 캡처 그룹에 대한 레퍼런스는 정의되지 않음. print "x[$+{x}]\n"; # "d" }}} 두번째 문제의 경우, Perl에서는 이름이 붙은 그룹도 이름이 없는 그룹들과 함께 처리되어 왼쪽에서부터 번호가 부여된다. (위 참고 링크에 따르면 .NET 스타일 정규식의 경우 일단 이름없는 그룹들부터 번호를 부여한 후, 그 다음 이름 붙은 그룹들 번호를 매긴다고) {{{#!vim perl 'acd' =~ /(a)(?b)?(c)(?d)/; print "[$1][$2][$3][$4]\n"; # [a][b][c][d], .NET스타일 정규식에선 [a][c][b][d] }}}
주인장 보충: * Perldoc:perlre 에 있는 예: {{{#!vim perl # before ---------------branch-reset----------- after / ( a ) (?| x ( y ) z | (p (q) r) | (t) u (v) ) ( z ) /x # 1 2 2 3 2 3 4 }}} * [http://www.effectiveperlprogramming.com/blog/559 Use branch reset grouping to number captures in alternations | The Effective Perler]에 있는 예 {{{#!vim perl / (?| (Buster) | # $1, $2는 undef (Mimi)(Roscoe) | # $1, $2 (Ella) # $1, $2는 undef ) ( # $3 Ginger ) /x }}} * 위 블로그 글 하단에 있는 요점: ** Perl 은 왼쪽괄호가 코드에서 나타나는 순서에 따라 캡처 그룹에 번호를 매긴다 ** alternation 안에 있는 모든 그룹에 대해 캡처 버퍼가 생성된다 ** 패턴 리셋 그룹핑 (?|...)을 사용하면 alternation 내의 각 대체 패턴마다 버퍼의 번호를 새로 시작한다 ** alternation 내에 named group 을 사용할 경우는 같은 번호가 매겨지는 그룹에는 같은 라벨을 붙일 것
(?|...)
그런데 이전 버전에는 버그가 있다. 아래 코드는 단지 그룹 내 부분 그룹의 순서를 바꿨을 뿐인데, 결과가 달라진다. {{{#!vim perl while (1) { my $input = ; chomp $input; if ( $input =~ /(?|(a)(b)|(c))(d)/ ) { # if ( $input =~ /(?|(c)|(a)(b))(d)/ ) { print "1[$1] 2[$2] 3[$3]\n"; } } }}} {{{#!vim (첫번째 if 문을 사용했을 때) abd 1[a] 2[b] 3[d] cd Use of uninitialized value $2 in concatenation (.) or string at d:\Temp\test.pl line 13, line 2. 1[c] 2[] 3[d] (두번째 if 문을 사용했을 때) abd Use of uninitialized value $3 in concatenation (.) or string at d:\Temp\test.pl line 13, line 1. 1[a] 2[d] 3[] cd Use of uninitialized value $3 in concatenation (.) or string at d:\Temp\test.pl line 13, line 2. 1[c] 2[d] 3[] }}} 이 문제를 피하려면, 그룹에 부여되는 번호가 가장 큰 (즉 캡처 그룹의 수가 가장 많은) 후보를 제일 마지막에 쓰면 안 된다. 또는 빈 그룹 ()을 채워넣어서 모든 후보의 그룹 갯수를 똑같이 맞춰주거나. 5.13.11에서 고쳐졌다고 함. (thanks to Twitter:am0c) 참고링크: * [http://perl5.git.perl.org/perl.git/commit/fd4be6f07df0e6a021290ef721c5d73550e0248c Perl git commit log] * [http://groups.google.com/group/comp.lang.perl.misc/browse_thread/thread/19ba20491f18d5b6?hl=ko# 뉴스그룹에 질문] * [http://pastebin.com/mMMVts6T 5.14에서 실행결과]
()
$-[0]
$+[0]
$n
$-[n]
$+[n]
$`
''
?
*
+
{ }
a|b|c...
'T'
e
r
m{1,2}
mm
.*
'm'
.?
'a'
X*
'X'
X+
Th
e|r
m{1,2}?
.*?
.??
"abc "
"abcdef "
a{0,1}+
a{0,}+
a{1,}+
주인장 추가: possessive quantifier에 대해 perlretut 문서의 내용이 잘 와닿지 않는다. 다음 두 문서를 참고하면 좋다. * [http://www.regular-expressions.info/possessive.html Regex Tutorial - Possessive Quantifiers] - 설명이 잘 나와 있음 * Cpan:perlre 일단, 독점 수량자는 greedy한 수량자와 서로 다른 매치 결과를 낼 수 있으니 주의하라: {{{#!vim perl 'aaaa' =~ /a++a/ }}} * 위 패턴은 매치되지 않는다. a++가 'aaaa' 전부에 매치되고, 그 다음 부분인 a에 매치될 게 남지 않는다. a+를 썼다면 이때 백트래킹하면서 'a'하나를 내어놓아서 다음 패턴에 매치되게 하였겠지만, 독점적 수량자는 백트래킹을 하지 않는다. 독점적 수량자가 유용한 경우의 예는 다음과 같다. {{{#!vim perl 'aaaa' =~ /a++b/ }}} * 위 패턴 역시 매치하지 않는다. 그러나 greedy 수량자를 썼을 경우는 a+ 정규식은 처음에 'aaaa'에 매치되고, b를 매치할 수 없으므로 한 글자를 백트래킹하여 'aaa'에 매치되고, 마찬가지로 'aa','a'에 매치되면서 계속 b를 매치시키려고 하며, 매번 무의미하게 실패하게 된다. 그러나 독점적 수량자를 사용한 경우 a++는 첫 시도에 'aaaa'에 매치된 후에, 그 위치에서 더 이상 백트래킹을 하지 않게 하므로, b가 스트링의 끝에 대응되어서 매치가 안 되는 것을 확인하는 순간 매치 실패를 판정한다. 매우 효율적이다. (단, 여기서 전체 검사가 완전히 종료되는 건 아니다. 스트링의 그 다음 위치, 즉 두번째 a부터 시작해서 'aaa'를 대상으로 다시 시도하게 된다) 따라서 독점적 수량자를 사용할 경우에는, 독점적 수량자를 적용하는 부분의 패턴이, 그 뒷부분에 있는 패턴과 매치되지 않는 게 확실한지 확인해야 한다. 위 예에서는 a++의 a가 뒤에 있는 패턴 b와 일치될 수 없다. 즉, 'a++을 매치시키는 동안, 실수로 스트링 내에 있는 'b'를 잡아먹어 버렸을 리가 없다'는 것이다. 반면 .++b 같은 패턴은 .가 b에도 매치되므로 의도하지 않은 결과를 낼 수 있다.
a++
'aaaa'
a
a+
b
.++b
\d*\.\d*
E
\
[ ]
#
\#
[#]
\d+
m''
//g
/(\w+)/g
/regexp/gc
\G
TGA
s/regexp/replacement/modifier
s///
simple_replace
s///g
simple_grep
print
s/$regexp/$replacement/g
$_
s///r
$x
$y
m//
s!!!
s{}{}
s{}//
split /regexp/, string, limit
//o
\U
\L
\cZ
(주인장 보충:) 바로 위 문단의 말은, (주인장이 제대로 이해했다면), 다음과 같은 코드로 확인할 수 있다: {{{#!vim perl my $str1 = "\uhello"; # $str1 = 'Hello' my $str2 = '\uhello'; # $str2 = '\uhello' say "match" if 'Hello' =~ /$str1/; # 매치됨 say "match" if 'Hello' =~ /$str2/; # 런타임 에러 }}} {{{#!vim match Unrecognized escape \u passed through in regex; marked by <-- HERE in m/\u <-- HERE hello/ at ... }}} $str2 변수 안에 들어있는 "\u"는 정규식에서는 인식하지 못하는 이스케이프 시퀀스로 취급되어 에러가 난다. perlretut 문서에 위 문단이 추가된 시점은 [http://perl5.git.perl.org/perl.git/commitdiff/7c579eed878fc49f1db8118b45c262d16571a5c1 여기서 처음], [http://perl5.git.perl.org/perl.git/commitdiff/8e71069ff4d55ae1ebf5da957f031d91cb878cb6 여기서 개정]
\x hex
use utf8
name
NamesList.txt
C:\strawberry\perl\lib\unicore\NamesList.txt
use 5.012
use feature 'unicode_strings'
\C
\p{name}
\p{L}
\p{Lu}
\P{Nd}
\pM
\p{...}
\P{...}
\p{Latin}
\p{Greek}
\p{Katakana}
=
:
\p{Script=Latin}
\p{Script:Greek}
\P{script=katakana}
A + COMBINING RING
alpha
alnum
ascii
cntrl
digit
graph
lower
punct
space
upper
xdigit
word
blank
[:upper:]
\p{IsUpper}
[:^digit:]
\P{IsDigit}
qr/string/
string
qr!!
qr{}
qr~~
qr''
@compiled
$kwds =~ /\b($command\w*)/g
\b
\w*
scalar @matches
(?char...)