簡體   English   中英

無法通過Perl腳本運行系統命令

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM