Perl - 用单引号加入'\ t'

时间:2015-12-09 11:02:55

标签: regex perl

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

'\t'

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

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

我在数组值

之间输入硬编码的\t
My\tName\tIs\tDave

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

qq{"$del"}

但它没有用。当我打印它时,我得到了

'"\t"'

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

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

有人可以告诉我如何用double替换单引号吗?

3 个答案:

答案 0 :(得分:5)

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

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

在此替换中,匹配是针对实际反斜杠后跟t

答案 1 :(得分:4)

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

如果您正在公开某个函数,而有人正在调用它将分隔符作为'\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。我更喜欢它。

答案 2 :(得分:1)

代码'\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;