替换包含正斜杠的字符串" /"在perl

时间:2017-03-12 14:03:33

标签: perl

我是字符串来替换包含" /"的字符串;使用Perl,使用下面的代码

file.txt包含

/usr/open/xyz -getCh $svr

open(FILE, "</tmp/file.txt") || die "File not found";
my @lines = <FILE>;
close(FILE);
 my $stringToReplace = "\/usr\/open\/xyz -getCh \$svr";
 my $stringToReplaceWith = "echo \"y\" | \/usr\/open\/xyz -getCh \$svr";
my @newlines;
foreach(@lines) {
   $_ =~ s/$stringToReplace/$stringToReplaceWith/g;
   push(@newlines,$_);
}

open(FILE, ">/tmp/file.txt") || die "File not found";
print FILE @newlines;
close(FILE);

以上代码对我不起作用。

1 个答案:

答案 0 :(得分:3)

关于代码的一些注意事项

  • 始终 use strictuse warnings 'all'位于您编写的每个Perl程序的顶部

  • 使用词法文件句柄和open

  • 的三参数形式
  • open调用可能由于无法找到文件以外的其他原因而失败。错误消息位于$!,您应该将其包含在die字符串

  • 使用单引号消除了字符串文字中大多数反斜杠的需要。正斜杠不需要在单引号或双引号内转义

  • 您应use constant定义常量值,尤其是如果您多次使用

  • 使用Perl的许多操作符默认操作$_

  • 的事实
  • 不需要数组@newlines。您仍在修改@lines,因此@newlines只是一个副本

  • 在正则表达式模式或双引号字符串中使用\Q...\E来转义每个非字母数字字符

最后一点将解决您的问题。正则表达式模式中的美元符号$表示行的结束,如果您希望按字面意义删除,则需要进行转义

您的程序的这种变化正常工作

use strict;
use warnings 'all';

use constant FILE => '/tmp/file.txt';

my @input = do {
    open my $fh, '<', FILE or die "Unable to open input file: $!";
    <$fh>;
};

my $old = '/usr/open/xyz -getCh $svr';
my $new = 'echo "y" | ' . $old;

open my $fh, '>', FILE or die "Unable to open output file: $!";

for ( @input ) {
    s/\Q$old/$new/g;
    print $fh $_;
}

print "Changes complete\n";