如何使用替换运算符插入文字转义序列?

时间:2015-12-12 00:09:27

标签: perl

此代码:

my $st = "37a64";
my $grep = '\n';
$st =~ s/a/$grep/;
print $st;

打印:

37\n64

我希望看到以下输出:

37
64

但我只能修改\n和正则表达式选项,因为我从其他文件导入$st

2 个答案:

答案 0 :(得分:1)

我不知道有一个现有模块可以做到这一点。

my %tr = (
   n => "\n",
   r => "\r",
   t => "\t",
   # ...
);

$grep =~ s{\\(?:(\W)|(.))}{
   defined($1) ? $1 :
   defined($tr{$2}) ? $tr{$2} :
   do { warn("Unrecognized escapes \\$2"); "\\$2" }
}seg;

请避免任何建议将输入传递给eval EXPR(有时会冒险伪装成s///ee)。他们肯定是马车和危险的。

答案 1 :(得分:0)

您可以使用/ee修饰符来评估替换:

$st =~ s/a/qq("$grep")/ee;

要了解其功能,请尝试

#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };


my @st = ("37a64") x 3;
my $grep = '\n';

$st[0] =~ s/a/qq("$grep")/;
say $st[0];                   # 37qq("\n")64


$st[1] =~ s/a/qq("$grep")/e;
say $st[1];                   # 37"\n"64

$st[2] =~ s/a/qq("$grep")/ee;
say $st[2];                   # 37
                              # 64