1

我想使用变量的值(例如由命令行选项固定)作为列表分隔符,使该值成为特殊字符(换行符、制表符等)。

不幸的是,由于以下两个打印语句的行为不同,这种天真的方法不起作用:

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 产生的结果)吗?

4

1 回答 1

3

如果您分配相同的字符串,它实际上确实工作相同。Perl 的

"\n"

创建一个由换行符组成的单字符字符串。使用我的外壳(bash),您可以使用

'
'

做同样的事情。

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

你没有这样做。您将一个由这两个字符组成的字符串传递给了\Perl n

如果您的程序将两个字符\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
于 2013-05-15T03:57:19.977 回答