문자를 발견하고 ((.)), 그 문자열과 동일한 문자를 발견하고 (\1), 11이 따라오는 것을 (11) 생각대로 표기하면 아래와 같다.
$_ = "aa11bb";
if (/(.)\111/) {
print "It matched!\n";
}
위의 코드는 제대로 동작하지 않았다. \1인지 \11인지 \111인지 판단할 수 없기 때문.
use 5.010;
$_ = "aa11bb";
if (/(.)\g{1}11/) {
print "It matched!\n";
}
제대로 수행될려면 \1을 \G{1}로 바꿔야 하는 것이다. use 5.010은 구식 펄이 저 문법을 제공하지 않기 때문에 추가한 것.
상대적 역참조를 이용할 수 있다.
use 5.010;
$_ = "aa11bb";
if (/(.)\g{-1}11/) {
print "It matched!\n";
}
상대적 역참조는 그룹()이 많아졌을 때도 동일하게 쓸 수 있는게 장점이다.
use 5.010;
$_ = "aa11bb";
if (/(.)(.)\g{-1}11/) {
print "It matched!\n";
}
숫자가 아닌 LABEL도 지원한다.
my $names = 'Fred Flinstone and Wilma Flinstone';
if ( $names =~ m/(?<last_name>\w+) and \w+ \g{last_name}/ ) {
say "I saw $+{last_name}";
}
LABEL이 없으면 $1부터 LABEL이 있으면 %+ 해쉬에 저장되어 있다.
정규식 뉴비로서 그룹과 상대적 역참조 그룹을 보고 신기해서 포스팅.