你似乎想用一個字符串,'store'
的,以建立一個變量名,$store
。這得到symbolic references的主題,並且你do not want to去那裏。
做你想做的事情的一種方法是構建一個散列,將這些字符串與相應的變量相關聯。然後捕獲在句子中括號內的字符串,並通過他們的哈希替換他們重視
use warnings;
use strict;
my $store = 'Media Markt';
my $time = 'morning';
my %repl = (store => $store, time => $time);
my $sentence = "I visited [store] in the [time]";
$sentence =~ s/\[ ([^]]+) \]/$repl{$1}/gex;
print "$sentence\n";
這將輸出線I visited Media Markt in the morning
正則表達式捕捉[ ]
之間的任何東西,通過使用negated character class[^]]
(比]
其他任何字符) ,匹配一次或多次(+
)。然後用它在散列中的值替換它,使用/e
來將替換端評估爲表達式。由於括號相匹配,他們最終被刪除。 /x
允許裏面的空間,以提高可讀性。
對於在括號中找到的每個字符串,散列中必須有一個鍵值對,否則您將收到警告。考慮到這一點,我們可以提供一個替代
$sentence =~ s{\[ ([^]+) \]}{$repl{$1}//"[$1]"}gex;
的defined-or
operator(//
)放回到"[$1]"
如果$repl{$1}
回報undef
(哈希沒有鑰匙$1
,或者它有undef
值)。因此沒有哈希對的字符串不變。我將分隔符更改爲s{}{}
,以便可以在裏面使用//
。
這不允許嵌套(如[store [name]]
),不處理多行字符串,並具有其他限制。但它應該適用於合理的情況。
'我$ store ='Media Markt'; my $ sentence =「我去過$商店」; print $ sentence;' – AbhiNickz
另請參閱:http://stackoverflow.com/q/1091634/632407 – jm666
請參閱[當某人回答我的問題時該怎麼辦?](http://stackoverflow.com/help/someone -answers) – zdim