perl スクリプトからネストされた perl システム コールを使用しています。
$file1 = shift @ARGV;
system("cat file.txt | perl -pi -e 's/OUTPUT/$file1/'");
問題は、$file1 に @ などの文字が含まれている場合、このように使用すると問題が生じることです。@... を配列として扱う代わりに、$file1 に含まれるものを「エスケープ」するように perl に指示する方法はありますか?
perl スクリプトからネストされた perl システム コールを使用しています。
$file1 = shift @ARGV;
system("cat file.txt | perl -pi -e 's/OUTPUT/$file1/'");
問題は、$file1 に @ などの文字が含まれている場合、このように使用すると問題が生じることです。@... を配列として扱う代わりに、$file1 に含まれるものを「エスケープ」するように perl に指示する方法はありますか?
引用メタ。
しかし、なぜ 2 番目の Perl プロセスを生成しているのですか? 同じスクリプトで実行できます。
my $file = shift;
{
local $^I = '';
local @ARGV = ('file.txt');
while (<>) {
s/OUTPUT/$file1/;
print;
}
}
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);