你似乎想用一个字符串,'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