2013-05-15 46 views
1

我想使用變量的值(例如通過命令行選項修正)作爲列表分隔符,啓用該值是一個特殊字符(換行符,製表等)

不幸的是,天真的做法不會因爲這兩個以下print語句的行爲differentely工作的事實:

my @tab = ("a","b","c"); 

# block 1 gives expected result: 
# a 
# b 
# c 
{ 
    local $" = "\n";     #" let us please the color syntax engine 
    print "@tab"; 
} 

# block 2 gives unwanted result: 
# a\nb\nc 
{ 
    use Getopt::Long; 
    my $s; 
    GetOptions('separator=s' => \$s); 
    local $" = "$s";     #" let us please the color syntax engine 
    print "@tab"; 
} 

任何想法,我可以修正塊2,以便得到想要的結果(由塊1產生的結果)?

回答

3

實際上,如果您分配相同的字符串,它的工作方式也是一樣的。 Perl的

"\n" 

創建一個由換行符組成的字符串。與我的外殼(bash),你會使用

' 
' 

做相同的。

$ perl a.pl --separator=' 
' 
a 
b 
ca 
b 
c 

你沒有這樣做。相反,您將包含兩個字符\n的字符串傳遞給Perl。

如果您的程序將兩個字符\n轉換爲換行符,您需要告訴它這樣做。

my @tab = qw(a b c); 

sub handle_escapes { 
    my ($s) = @_; 
    $s =~ s/\\([\\a-z])/ 
    $1 eq '\\' ? '\\' : 
    $1 eq 'n' ? "\n" : 
    do { warn("Unrecognised escape \\$1"); "\\$1" } 
    /seg; 
    return $s; 
} 

{ 
    my $s = '\n';      #" let us please the color syntax engine 
    local $" = handle_escapes($s); 
    print "@tab"; 
} 

{ 
    use Getopt::Long; 
    my $s; 
    GetOptions('separator=s' => \$s); 
    local $" = handle_escapes($s); #" let us please the color syntax engine 
    print "@tab"; 
} 

$ perl a.pl --separator='\n' 
a 
b 
ca 
b 
c 
相關問題