无法通过perl脚本运行系统命令

时间:2014-08-04 12:23:59

标签: regex perl cgi

您好我正在使用Perl单行代码将图像位置插入特定的文件行,如下所示

 my $image="/home/users/images/image1.tar";
 system(q(perl -pi -e 'print "\n$image" if ($. == 5 && $_=~ /^\s*$/ )' myfile.txt));

我无法在图像中插入图像位置。 请有人帮帮我吗?

2 个答案:

答案 0 :(得分:1)

我不确定你为什么要炮轰第二个Perl进程来执行此操作。为什么不在原始Perl程序中进行处理?

但是您的问题似乎是您传递给系统的字符串是单引号(使用q(...)),这意味着$image变量不会被扩展。您可能希望将其更改为双引号字符串(使用qq(...))。

<强>更新

这就是为什么炮轰外部流程充满困难的原因。您有一个需要传递的变量($image)和另一个需要在第二个进程内部的变量($_)。您还有一个转义序列(\s),shell正在尝试(但未能)解释。

自由应用反斜杠来转义特殊字符可以得到:

#!/usr/bin/perl

use strict;
use warnings;

my $image='/home/users/images/image1.tar';
system(qq(perl -pi -e 'print "\n$image" if (\$. == 5 && /^\\s*\$/ )' myfile.txt));

这似乎有效。但我仍然认为你在一个Perl程序中做这件事要好得多。

答案 1 :(得分:1)

正如所指出的那样,使用单引号q{}不允许您的$image变量进行插值。

要修复,只需将该变量连接到您的字符串中:

#!/usr/bin/perl

use strict;
use warnings;

my $image = '/home/users/images/image1.tar';
system(q{perl -pi -e 'print "\n} . $image . q{" if ($. == 5 && $_=~ /^\s*$/ )' myfile.txt});

但是,更好的解决方案就是在perl脚本本地执行此处理。

以下使用$INPLACE_EDIT

进行完全相同的处理而没有对perl进行二次调用
my $image = "/home/users/images/image1.tar";

local @ARGV = 'myfile.txt';
local $^I = '';
while (<>) {
    print "\n$image" if $. == 5 && $_ =~ /^\s*$/;
    print;
}

有关编辑文件的其他方法,请阅读perlfaq5 - How do I change, delete, or insert a line in a file, or append to the beginning of a file?