2013-07-21 5 views
0

(줄 바꿈을 유의하시기 바랍니다) 나는 텍스트 파일을했습니다 나는 일치하고 다음 텍스트를 지울 :대체에서 변수를 사용하는 방법은 무엇입니까?

[ From: 
http://www.website.com ] 

다음 코드는

$text =~ s/\[.*\]//ms; 

이 다른하지 않는

작동
my $patt = \[.*\]; 
$text =~ s/$patt//ms; 

누군가 내게 왜 친절한 설명을 해주겠습니까?

#!/usr/bin/perl 

use strict; 
use warnings; 

my $text = qq{a[ From: 
http://www.website.com ]b}; 

my $patt = qr/\[.*?\]/s; 
$text =~ s/$patt//; 

print $text; 

인쇄 :

ab 

내가 추가를하면 패턴 문자열을 인용하고 구문 오류를 제거하는 경우 사전

+3

따옴표 붙이지 않은 문자열이 "작동"하지 않는 이유는 무엇입니까? 그리고 제발 좀 더 구체적으로 ['그것은 작동하지 않습니다'] (http://tlp-perl.blogspot.se/2013/06/its-not-working.html) – TLP

+0

당신은 완벽하게, 내 "그것 does not work "는 코드가 아무 것도 아니므로 텍스트가 제거되지 않는다는 의미입니다. – Daniele

+0

네, 그것은 공정한 추측입니다. 그러나 파일 또는 유사 항목에서 읽는 경우 문제가 될 수있는 여러 줄 입력이 있습니다. – TLP

답변

3

두 번째 변종 덕분에, 완벽하게 작동? replizer를 ungreedy로 만들기 위해 정규 표현식에 한정 기호를 사용합니다. m 수정자를 제거했습니다. 정규 표현식에서 ^와 $를 사용하지 않으므로 m은 쓸모가 없습니다.

+1

...하지만 정규식의 통일 된 구문 분석 규칙에 대해서는 정규식 따옴표'my $ pat = qr /\[.*\]/ '를 사용해야합니다. 또한, OP는 아마도'*? '한정 기호를 원할 것입니다. – amon

+0

@amon 응답 향상. 고맙습니다. – user4035

+0

@ amon : 나는 그렇지 않다고 생각합니다. 이제 OP의 원본과 너무 멀어서 문제의 원인이'qr /../ '이 사용되지 않는다고 말하는 것 같습니다. '$ patt'의 정규 표현식이 다시 캐릭터 라인 화되고, 치환으로 보간되고, 재 컴파일되기 때문에, 어쨌든 여기에 그것들을 사용하는 것은 요지가 없습니다. * ""정규식 구문 분석 규칙에 대한 * "의미는 무엇입니까? – Borodin

1

변형이 작동하지 않는 유일한 이유는 $patt 문자열 주위에 따옴표를 넣지 않았기 때문입니다. 그것이 그대로 구문 오류를 throw합니다. 이

my $patt = '\[.*\]'; 
$text =~ s/$patt//ms; 

내 유일한 코멘트는 당신이 여기에 사용하지 않는 $^ 앵커의 동작을 수정로 /m 수정이 불필요하다는 것이다 잘 작동합니다. . 일치하는 개행 문자를 만들려면 /s 만 필요합니다.

+0

실제로. 코드를 다시 검사했지만 패턴을 실제로 인용했지만 "" ""기호를 사용 했으므로 구문이 부분적으로 패턴과 일치하여 하이퍼 링크의 첫 번째 "."만 일치시키고 제거했습니다. – Daniele

+0

@Daniele. 예, 큰 따옴표는 대괄호 앞에 백 슬래시를 삼켜 버리고 하나의 점이나 별표와 완전히 다른 정규식을 남깁니다. 실제로 잘못 된 문자열을 인쇄하는 것이 가장 좋습니다. 그것을 표시하는'Data :: Dump'. – Borodin

관련 문제