2009-07-01 2 views
9

\ 1을 $ 1과 반대로 실행하는 것과 다른 점은 무엇이 있습니까? 아니면 모든 상황에서 교환 할 수 있습니까?

예 : 그들은 모두 같은 결과를 제공하지만, 어떤 차이가

s/([a-z]+),afklol/$1,bck/; 
#against 
s/([a-z]+),afklol/\1,bck/; 

?

답변

16

스트레이트 perldoc perlre에서 :

$pattern =~ s/(\W)/\\\1/g; 

이것은의 RHS에 대한 예외 적용된된다

경고 대 1 \에 $ 1

어떤 사람들은 너무 같은 필기구에 익숙해 대신에 sed 중독자에게 충격을주지 마십시오. 을 얻는 것은 더러운 습관입니다. 왜냐하면 PerlThink에서 "s ///"의 오른쪽은 큰 따옴표로 묶인 문자열이기 때문입니다. 큰 따옴표로 묶인 문자열에서 "\ 1"은 제어 A를 의미합니다. "\ 1"의 을 의미하는 일반 유닉스는 "s ///"에서 kludged됩니다. 그러나 습관에 빠지면 수식어를 추가하면 "/ e" 수식어가 추가됩니다.

s/(\d+)/ \1 + 1 /eg;  # causes warning under -w 

아니면

s/(\d+)/\1000/; 

을하려고하면 당신은 "{1} 000", 당신은 으로 문제를 해결할 수있는 반면 "$ {1} 000" 을 말함으로써 그 모호성을 수 없습니다 . 보간 작업은 역 참조와 일치하는 작업과 함께 과 혼동해서는 안됩니다.

분명히 "s ///"의 왼쪽에는 두 개의 서로 다른 가지를 의미합니다.

1

그들은 같은 결과를 주지만, \ 1은 그 값을 유지하지만 \ 1은 그렇지 않습니다. 이 시도 : 난 단지 내가 패턴의 이전 부분의 반복을 포함하는 경기를 필요로하는 드문 경우에 \1를 사용

s/([a-z]+),afklol/$1,bck/; 
print "\$1 is $1\n"; 
#against 
s/([a-z]+),afklol/\1,bck/; 
print "\\1 is \1\n"; 
+1

m // 또는 s /// \ 1 외부는 역 참조가 아니기 때문입니다. (실제 내용은 상황에 따라 다릅니다.) –

9

. 예 :

"foobazfoo"또는 "barbazbar"와 일치하지만 "foobazbar"는 일치하지 않습니다. 당신은 $1를 사용할 수 없습니다.

기타 표기법을 사용하는 데 너무 많은 문제가 있기 때문에 다른 모든 경우에는 $1과 친족을 사용합니다. 자세한 내용은 perlre을 참조하십시오.

+1

그 질문을 보았을 때 궁금한 점이 있습니다. 둘 다 역 참조로 사용할 수 있습니까? – Axeman

관련 문제