如何在Perl字符串中插入文字\ t和\ n?

时间:2010-05-14 15:36:33

标签: perl

假设我有一个环境变量myvar

myvar=\tapple\n

当以下命令打印出此变量时

perl -e 'print "$ENV{myvar}"'

我确实会\tapple\n,但是,我希望对这些控制字符进行评估而不进行转义。我将如何实现它?

在现实世界$ENV居住替代,但我希望答案将涵盖这一点。

3 个答案:

答案 0 :(得分:3)

使用eval

perl -e 'print eval qq{"$ENV{myvar}"}' 

UPD:您还可以使用ee开关替换,这更安全:

perl -e '(my $s = $ENV{myvar}) =~ s/(\\n|\\t)/"qq{$1}"/gee; print $s'

答案 1 :(得分:2)

您应该使用String::Escape

use String::Escape qw(unbackslash);

my $var = unbackslash($ENV{'myvar'});

unbackslash unescapes它找到的任何字符串转义序列,将它们转换为它们代表的字符。如果您只想明确翻译\n\t,则可能需要使用s替换{{1}} ubstitution。

答案 2 :(得分:1)

包含\的字符序列没有什么特别之处。如果你想用一个字符序列替换另一个字符,那么在Perl中这很简单:

my %sequences = (
      '\\t' => "\t",
      '\\n' => "\n",
      'foo' => 'bar',
      );

 my $string = '\\tstring fool string\\tfoo\\n';

 print "Before: [$string]\n";
 $string =~ s/\Q$_/$sequences{$_}/g for ( keys %sequences );
 print "After: [$string]\n";

唯一的技巧是跟踪Perl认为它是转义字符的时间。

Before: [\tstring fool string\tfoo\n]
After: [    string barl string  bar
]

但是,作为darch notes,您可能只能使用String::Escape

请注意,从环境变量中获取值时必须非常小心。我不愿意使用String::Escape,因为它可能比您愿意翻译的处理要多得多。安全的方法是仅扩展您明确要允许的特定值。请参阅我在Mastering Perl中的“安全编程技术”章节,其中我将讨论此问题,以及在这种情况下您可能想要使用的污点检查。