您好我正在使用Perl单行代码将图像位置插入特定的文件行,如下所示
my $image="/home/users/images/image1.tar";
system(q(perl -pi -e 'print "\n$image" if ($. == 5 && $_=~ /^\s*$/ )' myfile.txt));
我无法在图像中插入图像位置。 请有人帮帮我吗?
答案 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
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?