2013-07-16 70 views

回答

8

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的字符串。

+0

因此,使用標準perl模塊做這件事的唯一方法是'eval',對吧? –

+1

@thebrxinthewalls:是的,雖然你可以編寫一些特殊情況。查看我的更新。使用非核心模塊有什麼問題?安裝模塊非常簡單。 – Borodin

相關問題