首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Perl字符串中插入文字\t和\n?

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

Stack Overflow用户
提问于 2010-05-14 23:36:33
回答 3查看 1.1K关注 0票数 4

假设我有一个环境变量myvar

代码语言:javascript
复制
myvar=\tapple\n

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

代码语言:javascript
复制
perl -e 'print "$ENV{myvar}"'

我将使用\tapple\n,但是,我希望对这些控制字符进行求值,而不是转义。我将如何实现它?

在现实世界中,$ENV驻留在替代中,但我希望答案能涵盖这一点。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-05-14 23:54:50

使用eval

代码语言:javascript
复制
perl -e 'print eval qq{"$ENV{myvar}"}' 

更新:您也可以将替换与ee开关一起使用,这更安全:

代码语言:javascript
复制
perl -e '(my $s = $ENV{myvar}) =~ s/(\\n|\\t)/"qq{$1}"/gee; print $s'
票数 3
EN

Stack Overflow用户

发布于 2010-05-15 03:48:21

您可能应该使用String::Escape

代码语言:javascript
复制
use String::Escape qw(unbackslash);

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

unbackslash对找到的任何字符串转义序列进行转义,将它们转换为它们所表示的字符。如果您只想显式地转换\n\t,那么您可能必须使用s替代来完成这项工作,就像this answer一样。

票数 2
EN

Stack Overflow用户

发布于 2010-05-15 07:01:36

包含\的字符序列没有什么特别之处。如果您想用一个字符序列替换另一个字符序列,在Perl中很容易做到:

代码语言:javascript
复制
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认为它是转义字符的时间。

代码语言:javascript
复制
Before: [\tstring fool string\tfoo\n]
After: [    string barl string  bar
]

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2835423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档