-->

Perl的:如何使用$ LIST_SEPARATOR命令行的特殊字符(换行符,制表)($ \“)(P

2019-10-18 03:31发布

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

不幸的是,天真的方法并不由于工作是以下两个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中制作的)?

Answer 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";
}

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


文章来源: Perl: How to use command line special characters (newline, tab) in $LIST_SEPARATOR ($\")