[英]Not able to run system command through perl script
嗨,我正在使用Perl一線代碼將圖像位置插入文件的特定行,如下所示
my $image="/home/users/images/image1.tar";
system(q(perl -pi -e 'print "\n$image" if ($. == 5 && $_=~ /^\s*$/ )' myfile.txt));
我無法在文件中插入圖像位置。 請任何人能幫助我嗎?
我不確定為什么要花第二個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程序中完成所有這些操作。
如前所述,使用單引號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-如何更改,刪除或在文件中插入一行,或追加到文件的開頭?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.