假设我有一个环境变量myvar
myvar=\tapple\n以下命令何时打印出此变量
perl -e 'print "$ENV{myvar}"'我将使用\tapple\n,但是,我希望对这些控制字符进行求值,而不是转义。我将如何实现它?
在现实世界中,$ENV驻留在替代中,但我希望答案能涵盖这一点。
发布于 2010-05-14 23:54:50
使用eval
perl -e 'print eval qq{"$ENV{myvar}"}' 更新:您也可以将替换与ee开关一起使用,这更安全:
perl -e '(my $s = $ENV{myvar}) =~ s/(\\n|\\t)/"qq{$1}"/gee; print $s'发布于 2010-05-15 03:48:21
您可能应该使用String::Escape。
use String::Escape qw(unbackslash);
my $var = unbackslash($ENV{'myvar'});unbackslash对找到的任何字符串转义序列进行转义,将它们转换为它们所表示的字符。如果您只想显式地转换\n和\t,那么您可能必须使用s替代来完成这项工作,就像this answer一样。
发布于 2010-05-15 07:01:36
包含\的字符序列没有什么特别之处。如果您想用一个字符序列替换另一个字符序列,在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中的“安全编程技术”一章,在那里我将讨论这一点,以及在这种情况下您可能想要使用的污点检查。
https://stackoverflow.com/questions/2835423
复制相似问题