Perl:如何在$LIST_SEPARATOR ($)中使用命令行特殊字符(换行符,制表符)



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

不幸的是,naïve方法不起作用,因为以下两个打印语句的行为不同:

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:
# anbnc
{
  use Getopt::Long;
  my $s;
  GetOptions('separator=s' => $s);
  local $" = "$s";                    #" let us please the color syntax engine
  print "@tab";
}

是否知道我可以纠正块2,以便我得到想要的结果(由块1产生的结果)?

如果你分配相同的字符串,它实际上是一样的。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";
}

& # x20的;

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

最新更新