【问题标题】:replace a string containing forward slash "/" in perl在perl中替换包含正斜杠“/”的字符串
【发布时间】:2017-03-13 00:29:17
【问题描述】:

我是使用 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);

上面的代码对我不起作用。

【问题讨论】:

  • 这与斜线无关。问题是(可能)正则表达式中的$ 查找字符串结尾,而不是文字美元符号。但是“代码不起作用”并不是问题描述,而且您似乎没有花任何精力自己去追踪问题(您的代码远非最小)。
  • use strict; use warnings;开始每个Perl文件。
  • 使用词法变量,而不是裸字文件句柄。
  • 使用 3-arg 打开,而不是 2-arg 打开。
  • File not found 不是一个有用的错误消息,特别是如果这不是实际问题。在错误消息中包含您尝试打开的文件的名称,以及$!(其中包含打开失败的真正原因)。

标签: perl


【解决方案1】:

关于您的代码的一些注释

  • 总是 use strictuse warnings 'all' 在您编写的每个 Perl 程序的顶部

  • 使用词法文件句柄和open的三参数形式

  • open 调用可能会因许多原因而失败,而不是找不到文件。错误消息在$! 中,您应该将其包含在您的die 字符串中

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

  • 您应该use constant 来定义常量值,尤其是在您多次使用时

  • 利用许多 Perl 运算符默认作用于$_这一事实

  • 不需要数组@newlines。无论如何你都在修改@lines,所以@newlines 只是一个副本

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

最后一点将解决您的问题。正则表达式模式中的美元符号 $ 表示一行的结尾 0f,如果您想按字面意思理解,则需要对其进行转义

您的程序的这种变体可以正常工作

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";

【讨论】:

    猜你喜欢
    • 2018-02-27
    • 2016-07-10
    • 2018-01-29
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 2011-12-22
    相关资源
    最近更新 更多