Perl會在編譯時轉換字符串中的轉義序列,因此一旦程序運行,您已經爲時過晚而無法將"\t"
和"\n"
轉換爲製表符和換行符。
使用eval
會解決這個問題,但它是非常不安全的。我建議你在編譯後使用String::Interpolate
模塊來處理字符串。它使用Perl的原生插值引擎,因此具有與將字符串編碼到程序中完全相同的效果。
你test.pl
成爲
use strict;
use warnings;
use String::Interpolate qw/ interpolate /;
my $str = shift;
printf interpolate($str), @ARGV;
輸出
E:\Perl\source>perl test.pl "x\tx%s\n%s" one two three
x xone
two
E:\Perl\source>
更新
如果您只是想允許POSS的一小部分ibilities是String::Interpolate
支持,那麼你可以寫的東西明確像,說
use strict;
use warnings;
my $str = shift;
$str =~ s/\\t/\t/g;
$str =~ s/\\n/\n/g;
printf $str, @ARGV;
而是一個模塊或eval
是唯一真實的方式來支持在命令行上一般的Perl的字符串。
因此,使用標準perl模塊做這件事的唯一方法是'eval',對吧? –
@thebrxinthewalls:是的,雖然你可以編寫一些特殊情況。查看我的更新。使用非核心模塊有什麼問題?安裝模塊非常簡單。 – Borodin