我想使用变量的值(例如,通过命令行选项修复)作为列表分隔符,使该值成为特殊字符(换行符,制表符等)。
不幸的是,天真的方法不起作用,因为以下两个print语句表现不同:
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产生的结果)?
答案 0 :(得分:3)
如果指定相同的字符串,它实际上也是一样的。 Perl的
"\n"
创建一个由换行符组成的字符串。使用我的shell(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