2013-07-21 94 views
0

我有一個文本文件,我想匹配並刪除下面的文本(請注意換行):如何在替換中使用變量?

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

下面的代碼工作

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

這等不

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

有人會這麼好解釋我爲什麼? 在此先感謝

+3

爲什麼沒有引號的字符串「工作」?並且請比['不起作用]更具體(http://tlp-perl.blogspot.se/2013/06/its-not-working.html) – TLP

+0

你是完全正確的,我的「它不起作用「意味着代碼不匹配任何東西,因此文本不會被刪除。 – Daniele

+0

是的,這是一個公平的猜測。但是,您有多行輸入,如果您正在從文件或類似文件中讀取數據,則可能會出現問題。 – TLP

回答

3

的第二個變體完美地工作,如果你引用的模式字符串和擺脫語法錯誤的:

#!/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 

我說?量化到正則表達式以使替換不合格。並刪除m修飾符,因爲您沒有在您的正則表達式中使用^和$,所以m無用。

+1

...但是你應該使用正則表達式引用'my $ pat = qr /\[.*\]/'來獲得正則表達式的統一解析規則。另外,OP可能需要'*?'量詞。 – amon

+0

@amon答案改進了。謝謝。 – user4035

+0

@amon:我想不是。這與OP原來的距離太遠了,看起來好像是說這個問題的原因是沒有使用'qr /../'。無論如何,在這裏使用它們確實沒有意義,因爲'$ patt'中的正則表達式再次被字符串化,插入到替換中,並重新編譯。 *「對於正則表達式的統一解析規則」*是什麼意思? – Borodin

1

變體不起作用的唯一原因是您沒有在您的$patt字符串周圍加上引號。因爲它會引發語法錯誤。這工作得很好

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

我唯一的評論是,/m改性劑是多餘的,因爲它修改$^錨,你不使用這裏的行爲。需要/s才能使.與換行符匹配。

+0

確實。我重新檢查了我的代碼,我實際上引用了該模式,但我使用了「」「符號,因此語句部分地匹配了模式,只匹配超鏈接中的第一個」。「並將其刪除。 – Daniele

+0

@Daniele。是的,雙引號會在方括號前面加上反斜槓,並給你一個完全不同的正則表達式,它只匹配一個點或者星號。最好打印一個字符串,它看起來真的很糟糕,或者 - 更好 - 使用'Data :: Dump'來顯示它。 – Borodin