2013-05-29 26 views
0

我有一个perl脚本和一个.config文件,并且希望在配置文件中存储一些散列作为其值,然后从我的perl脚本动态更改它们。在perl配置文件中设置变量eval

配置文件:

$hash{"hello"} = ["$blah", "$blah2"]; 

我的perl脚本:

if (-e ".config") 
{ 
    $blah = "hello"; 
    $blah2 = "world!"; 

    eval ('require(".config")'); 

    $val1 = $hash{"hello"}[0]; 
    $val2 = $hash{"hello"}[1]; 
    print "$val1 $val2\n"; 

    # Now I want to CHANGE blah and blah2 
    $blah = "world!"; 
    $blah2 = "hello"; 

    $val1 = $hash{"hello"}[0]; 
    $val2 = $hash{"hello"}[1]; 
    print "$val1 $val2\n"; 
} 

但两者的打印显示hello world!好像变化没有发生..我缺少的东西?

谢谢。

+0

这个的任何例子?新的perl ..谢谢! – Travv92

+0

另请参阅:http://stackoverflow.com/questions/7506782/initializing-perl-variables-using-eval –

回答

2

(奇怪......我以前从来没有见过这种类型的问题,然后它的变体(这些变体足够明显不是一个交叉帖子)出现在这里和PerlMonks在相同天)

你错过的一点是,

$hash{"hello"} = ["$blah", "$blah2"]; 

只是复制$blah$blah2$hash{hello}通过引用(匿名数组)。它不会在哈希和$blah/$blah2之间创建任何持久连接。

作为便笺,该行中的引号都不起任何作用。它会更普遍被写为:

$hash{hello} = [$blah, $blah2]; 

或者,如果你想使$blah$hash{hello}[0]永远联系在一起,以创建引用和改变人们也将改变其他:

$hash{hello} = [\$blah, \$blah2]; 

注意,在这种情况下,你一定不要使用引号。虽然"$blah"$blah是等价的,"\$blah"\$blah不 - \$blah使您$blah一个参考,但"\$blah"给你的文本字符串“$嗒嗒”没有在所有涉及的变量。

+0

嗨,谢谢你的答案。不幸的是,我的实现需要引用值,它实际上是一个命令(但为简单起见,我在这里省略了它们)。例如:'$ hash {“hello”} = [“somecommand $ blah”,“somecommand2 $ blah2”]'。我一直在测试它的一些变体,包括'\($ blah)''(\ $ blah)'等,但似乎没有任何工作。他们都要么两次发出'hello world'而不是'hello world'' world hello'或错误.. – Travv92

+0

在这种情况下,您将不得不分配'$ blah =(“somecommand $ blah”的结果) '并将其引用到你的散列中。没有办法对文字字符串进行可变引用。 –

+0

在这种情况下,我将如何去替换字符串文字?我真的需要能够替换.config文件中的字符串文字,并返回该命令,而不实际更改.config中的数据,因为它是模板。 – Travv92