假设我有一个环境变量myvar
:
myvar=\tapple\n
当以下命令打印出此变量时
perl -e 'print "$ENV{myvar}"'
我确实会\tapple\n
,但是,我希望对这些控制字符进行评估而不进行转义。我将如何实现它?
在现实世界$ENV
居住替代,但我希望答案将涵盖这一点。
答案 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中的“安全编程技术”章节,其中我将讨论此问题,以及在这种情况下您可能想要使用的污点检查。