2013-03-19 108 views
0

我使用此代碼通過正則表達式匹配來更改字符串。Perl:通過正則表達式匹配來更改字符串

$a->{'someone'} = "a _{person}"; 
$a->{'person'} = "gremlin"; 

$string = "_{someone} and a thing" 
while($string =~ /(_\{(.*?)\}/g){ 
    $search = metaquote($1); 
    $replace = $a->{$2}; 
    $string =~ s/$search/$replace/; 
} 

結果是a _{person} and a thing但我很期待:a gremlin and a thing

怎麼辦才能使用它?

+1

始終'使用嚴格的;'這樣你就可以避免很多問題 – PSIAlt 2013-03-19 21:16:52

+0

我不知道你正在運行的代碼來得到這一結果。你發佈了散列三個語法錯誤,所以不能編譯。當它們被修復時,它完全按照你說的要求。 – Borodin 2013-03-19 21:38:38

+0

感謝choroba他修正了編譯錯誤。對不起,只是輸入了我今天從我的麻煩中記起的事情。我現在想知道爲什麼它今天早些時候還沒有奏效。明天我必須再看看真正的問題。 – m42e 2013-03-19 22:31:17

回答

4

該功能被稱爲quotemeta,而不是metaquote。此外,一個右括號中缺少您的正則表達式:

​​

我還添加了strictwarnings,以幫助自己避免常見錯誤。

2

我想這應該是更effecient變種:

use strict; 
my $a; 
$a->{'someone'} = "a _{person}"; 
$a->{'person'} = "gremlin"; 

my $string = "_{someone} and a thing"; 
while($string =~ s/(_\{(.*?)\})/ $a->{$2} /ges) {} 
print $string."\n"; 
+0

這是一段糟糕的代碼,不僅僅是因爲如果相關的哈希元素不存在,它將無限循環。你真的應該測試你的答案。 – Borodin 2013-03-19 21:43:37

0

這種變異反覆substitues字符串中的佔位符所有其對應的哈希值,直至一個也不剩。

此外,a是任何變量的錯誤標識符,所以我將其命名爲tokens

use strict; 
use warnings; 

my %tokens = (
    someone => 'a _{person}', 
    person => 'gremlin', 
); 

my $string = '_{someone} and a thing'; 

1 while $string =~ s/_\{([^}]+)\}/$tokens{$1}/g; 

print $string, "\n"; 

輸出

a gremlin and a thing 
+0

@hobbs:它會像原始文件一樣替換空字符串。它還會提出警告,因爲它啓用了未初始化的警告,我認爲這是可取的。 – Borodin 2013-03-19 21:34:08

+0

哎呀,我誤解了原文。異議退出:) – hobbs 2013-03-19 22:00:17