2014-11-18 2 views
2

моего содержимого текстового файлаPerl один лайнер внутри PERL скрипта не работает

vi /root/text.conf 

node.session.auth.authmethod = hello 

поэтому моя одна команды лайнера Perl заменяет содержимое файла выше, комментируя с #. Прекрасно работает при запуске в качестве одной команды

perl -pi -e 's/^(node.session.auth.authmethod\s*=\s*).*$/#\1hello/g' /root/text.conf 

когда Perl один код вкладыш выполнен в PERL скрипт, он не закомментировать содержимое text.conf файлов.

$cmd ="perl -pi -e 's/^(node.session.auth.authmethod\s*=\s*).*$/#\1hello/g' /root/text.conf" 

$line = `$cmd 2>&1`;$ret = $?; 

Я что-то упускаю во время выполнения Perl одного лайнера внутри скрипта Perl.

+2

Не делайте этого. Это очень неприятно для матрешки ваших сценариев. – Sobrique

ответ

3

Да, используйте текущий процесс perl вместо нового. Это эквивалентно ваш

perl -pi -e 's/^(node.session.auth.authmethod\s*=\s*).*$/#\1hello/g' /root/text.conf 

однострочника,

use strict; 
use warnings; 

local $^I = ""; 
local @ARGV = "/root/text.conf"; 

while (<>) { 
    s/^(node.session.auth.authmethod\s*=\s*).*$/#\1hello/g; 
    print; 
} 
1

Определение вашей $cmd Переменная $/ будет заменен его значение (строка разделитель). Тогда регулярное выражение не будет соответствовать вашей линии.

Попробуйте использовать одиночные кавычки (наряду с правильным экранирования):

$cmd ='perl -pi -e \'s/^(node.session.auth.authmethod\s*=\s*).*$/#\1hello/g\' /root/text.conf' 

$line = `$cmd 2>&1`;$ret = $?; 

Это предотвратит Perl от расширения переменных.

Тем не менее, ответ mpapec прав, зачем нарисовать новый процесс?

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