【问题标题】:Perl one liner inside a perl script not workingPerl脚本中的Perl一个衬里​​不起作用
【发布时间】:2015-01-15 06:21:32
【问题描述】:

我的文本文件内容

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 one liner 代码时,不会注释掉 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 一行时我是否遗漏了什么。

【问题讨论】:

  • 不要那样做。给你的脚本套娃是很讨厌的。

标签: perl


【解决方案1】:

是的,使用当前的 perl 进程而不是 fork 新进程。这相当于你的

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;
}

【讨论】:

    【解决方案2】:

    定义您的$cmd 变量$/ 将被它的值(行分隔符)替换。那么正则表达式将与您的行不匹配。

    尝试使用单引号(以及适当的转义):

    $cmd ='perl -pi -e \'s/^(node.session.auth.authmethod\s*=\s*).*$/#\1hello/g\' /root/text.conf'
    
    $line = `$cmd 2>&1`;$ret = $?;
    

    这将阻止 perl 扩展变量。

    尽管如此,mpapec 的回答是对的,为什么要分叉一个新进程?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-04
      相关资源
      最近更新 更多