說我有一個環境變量myvar
:如何在Perl字符串中插入文字 t和 n?
myvar=\tapple\n
當下面的命令將打印出這個變量
perl -e 'print "$ENV{myvar}"'
我會從字面上\tapple\n
,不過,我想那些控制字符進行評估和沒有逃脫。我將如何實現它?
在真實世界$ENV
居住在替代,但我希望答案會覆蓋。
說我有一個環境變量myvar
:如何在Perl字符串中插入文字 t和 n?
myvar=\tapple\n
當下面的命令將打印出這個變量
perl -e 'print "$ENV{myvar}"'
我會從字面上\tapple\n
,不過,我想那些控制字符進行評估和沒有逃脫。我將如何實現它?
在真實世界$ENV
居住在替代,但我希望答案會覆蓋。
使用eval:
perl -e 'print eval qq{"$ENV{myvar}"}'
UPD:您還可以使用替代與ee
開關,這是更安全:
perl -e '(my $s = $ENV{myvar}) =~ s/(\\n|\\t)/"qq{$1}"/gee; print $s'
你或許應該使用String::Escape
。
use String::Escape qw(unbackslash);
my $var = unbackslash($ENV{'myvar'});
unbackslash
反轉義發現的任何字符串轉義序列,把它們變成它們所代表的字符。如果您只想明確地只翻譯\n
和\t
,那麼您可能必須自己執行s
修改,如this answer。
對於包含\
的字符序列,沒有什麼特別的特別之處。如果要替換的字符的一個序列另一個,這是非常簡單的用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中的我的「安全編程技巧」一章,在此討論此問題,以及在此情況下可能要使用的污點檢查。
備份一個步驟,爲什麼你的環境變量中有這些序列? – 2010-05-15 23:12:32
@brian d foy:因爲它們來自文本文件,多行和格式。 – Pablo 2010-05-16 00:59:15