【问题标题】:Execute Unix command in a Perl script在 Perl 脚本中执行 Unix 命令
【发布时间】:2012-03-29 06:23:31
【问题描述】:

我怎样才能使刻度内的以下外部命令改为使用变量?

或者类似的东西?

sed -i.bak -e '10,16d;17d' $docname; (这行得通)

sed -i.bak -e '$line_number,$line_end_number;$last_line' $docname;

【问题讨论】:

  • 可以试试这个:system(qq{sed -i.bak -e '$line_number,$line_end_number;$last_line' $docname})

标签: perl unix variables command execute


【解决方案1】:
my $result = 
      qx/sed -i.bak -e "$line_number,${line_end_number}d;${last_line}d" $docname/;

哪里的线分割避免了SO上的水平滚动条;否则,它将在一行上。

或者,因为不清楚是否有任何输出要捕获:

system "sed -i.back '$line_number,${line_end_number}d;${last_line}d' $docname";

或者您可以自己将其拆分为参数:

system "sed", "-i.back", "$line_number,${line_end_number}d;${last_line}d", "$docname";

这往往更安全,因为 shell 没有机会干扰参数的解释。

【讨论】:

  • 我建议总是使用 Perl 的 system() 函数的多参数形式,除非您有特定要求让 shell 解析一些参数(I/O重定向等)
【解决方案2】:
@args = ("command", "arg1", "arg2");
system(@args) == 0 or die "system @args failed: $?"

手册的更多内容:

perldoc -f system

【讨论】:

    【解决方案3】:

    我认为您应该阅读有关使用 qq 处理字符串的内容。

    你可能想要这样的东西:

    use strict;
    use warnings;
    
    my     $line_number = qq|10|;
    my $line_end_number = qq|16d|;
    my       $last_line = qq|17d|;
    my        $doc_name = qq|somefile.bak|;
    my     $sed_command = qq|sed -i.bak -e '$line_number,$line_end_number;$last_line' $doc_name;|;
    
    print $sed_command;
    qx|$sed_command|;
    

    【讨论】:

      猜你喜欢
      • 2012-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-12
      • 1970-01-01
      • 2012-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多