【发布时间】:2011-03-28 01:23:11
【问题描述】:
我正在尝试修改 perl 脚本以注释掉所有匹配某种模式的行。在正常的命令提示符下,这是我要添加的行:
grep -lIRZ --exclude="*\.svn*" "pattern" . | xargs -0 -l sed -i -e 's/.*pattern.*/\/\/&/g'
这是在 perl 脚本的上下文中:
my $rmcmd = "grep -lIRZ --exclude=\"*\\.svn*\" \"pattern\" . | xargs -0 -l sed -i -e 's/.*pattern.*/\\/\\/&/g'";
runcmd($rmcmd);
...
sub runcmd {
my @cmd = @_;
print "Running: @cmd\n";
system(@cmd);
# Get status from system
my $ret = $? >> 8;
if ($ret) {
print "-E- command completed with error code $ret.\n";
exit(1);
}
return ($ret);
}
从命令提示符运行时一切正常,但运行相同命令的脚本总是崩溃。
有什么不同的地方,我该如何解决?
【问题讨论】:
-
(1) 请发布您得到的确切错误。 (2) 请打印并发布
$rmcmd的值——理想情况下,通过print和Perl 调试器。 (3) 正确的解决方案是将整个复杂的管道重写为 Perl 代码。 -
(1)确切的错误是:-E- command completed with error code 1.
(2)打印函数返回:grep -lIRZ --exclude="\ .svn" "dlclose" . | xargs -0 -l sed -i -e 's/.*dlclose.*/\/\/&/g'
(3)我是perl新手,脚本中已经定义了runcmd。在 Perl 代码中管道的正确方法是什么?你能给我一些参考吗? -
你为什么不在 Perl 中做这一切?你让你的代码不可移植。
-
这个 Perl 脚本已经存在并用于执行夜间构建。我只添加这一项操作。另外,runcmd 已经是我正在调用的现有脚本的一个函数。
-
更好的问题是“我如何在 Perl 中编写这个?”