1

perl スクリプトからネストされた perl システム コールを使用しています。

$file1 = shift @ARGV;
system("cat file.txt | perl -pi -e 's/OUTPUT/$file1/'");

問題は、$file1 に @ などの文字が含まれている場合、このように使用すると問題が生じることです。@... を配列として扱う代わりに、$file1 に含まれるものを「エスケープ」するように perl に指示する方法はありますか?

4

2 に答える 2

4

引用メタ

しかし、なぜ 2 番目の Perl プロセスを生成しているのですか? 同じスクリプトで実行できます。

my $file = shift;
{
    local $^I = '';
    local @ARGV = ('file.txt');
    while (<>) {
        s/OUTPUT/$file1/;
        print;
    }
}
于 2012-06-19T16:10:49.590 に答える
3

perl の内部から perl を呼び出す必要はないはずです。このようなものが動作するはずです:

my $file1 = shift;
my @data;
open(my $fh, '<+', 'file.txt') or die $!;
while (<$fh>) {
   $_ =~ s/OUTPUT/$file1/;
   push(@data, $_);
}

seek($fh, 0, 0);
truncate($fh, 0);

for my line (@data) {
   print ${fh} $line;
}
close($fh);
于 2012-06-19T16:08:42.270 に答える