2013-05-29 3 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

В этом случае, как мне пойти на замену литералов String? Мне действительно нужно иметь возможность заменить строковые литералы в файле .config и вернуть команду без фактического изменения данных в .config, поскольку это шаблон. – Travv92

Смежные вопросы