在Perl脚本内部Perl一个衬垫不起作用

时间:2014-11-18 06:24:02

标签: perl

我的文字文件内容

vi /root/text.conf

node.session.auth.authmethod = hello

所以我的one liner 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 one liner时,我遗漏了什么。

2 个答案:

答案 0 :(得分: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 :(得分: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的回答是正确的,为什么要求新流程?