【问题标题】:Perl - Join on '\t' in single quotesPerl - 在单引号中加入'\ t'
【发布时间】:2015-12-09 11:02:55
【问题描述】:

在我的后端 Perl 代码中,我收到单引号中的分隔符,例如

'\t'

当我尝试像这样使用JOIN 函数时

my $string = join ( $del, @aArray );

我在数组值之间使用硬编码的\t 得到输出

My\tName\tIs\tDave

我尝试将引号更改为 $del 的双引号,因为 "\t" 有效。所以我尝试转换

qq{"$del"}

但它没有工作。当我在上面打印时,我得到了

'"\t"'

我也试过正则表达式无济于事

$del =~ s/'/"/g;

谁能告诉我如何用双引号代替单引号?

【问题讨论】:

  • 你说的你收到是什么意思?某些您无法控制的代码是否使用'\t' 作为参数调用您的代码?请详细解释一下。

标签: regex perl


【解决方案1】:

您如何“接收”分隔符?如果\t 以某种方式作为字符串传递给您的 perl 程序,那么您的 perl 程序中的任何引用都不会将其转换为制表符。相反,您必须检测包含 \t 的字符串并将其转换为制表符。

$del =~ s/\\t/\t/;

在这个替换中,匹配的是一个实际的反斜杠,后跟一个t

【讨论】:

    【解决方案2】:

    此答案基于假设,直到问题更清楚为止。

    如果您要公开一个函数,并且有人调用它并将分隔符传递为'\t',您可以通过多种方式来处理它。我已将它们从最差到最好的解决方案排序。

    • 字符串-eval它。这是危险的,因为你不知道可以传入什么样的代码。

      use strict;
      use warnings;
      use feature 'say';
      sub my_join {
          my ($del, @stuff) = @_;
      
          return unless $del;
          return if length $del > 2;
          $del = eval qq{"$del"};
      
          say join $del, @stuff;
      }
      
      my_join( '\t', qw(My name Is Dave) );
      

      这将提供正确的输出,但它不会保存,因为您无法控制输入。有人可能会做坏事。这就是为什么有length 检查。当然,像... 这样的分隔符不再可能了。这可能是你想要的。

      请不要使用eval我只是把它放在这里以获得完整的答案。

    • 使用查找表。

      use strict;
      use warnings;
      use feature 'say';
      
      sub my_join {
          my ($del, @stuff) = @_;
      
          my %lookup = (
             '\t' => "\t",
             '\n' => "\n",
          );
      
          $del = $lookup{$del} if exists $lookup{$del};
      
          say join $del, @stuff;
      }
      
      my_join( '\t', qw(My name Is Dave) );
      

      使用此解决方案,您可以准确控制要转换的分隔符。所有其他人将按原样使用。或者,如果它们在您的查找哈希中不存在,您可以不允许它们。

    • 请参阅Neil Massons's answer 了解最佳方法,即短正则表达式替换。我更喜欢它。

    【讨论】:

      【解决方案3】:

      代码'\t' 生成两个字符的字符串\t
      代码"\t" 生成单个字符串Tab。

      也许您想要以下内容:

      $del = "\t" if $del eq '\t';
      

      但这引出了一个问题...如果您希望分隔符是两个字符\t 怎么办?以下是提供类似于双引号字符串文字所使用的通用转义机制的解决方案:

      my %tr = (
         n => "\n",
         r => "\r",
         t => "\t",
         # ...
      );
      
      $str =~ s{\\(?:(\W)|(.))}{
         defined($1) ? $1 :
         defined($tr{$2}) ? $tr{$2} :
         do { warn("Unrecognized escapes \\$2"); "\\$2" }
      }seg;
      

      【讨论】:

        猜你喜欢
        • 2016-10-02
        • 2013-02-16
        • 2011-07-03
        • 2014-06-19
        • 1970-01-01
        • 1970-01-01
        • 2011-09-27
        • 2010-10-30
        相关资源
        最近更新 更多