Perl字符串拆分和连接

时间:2013-11-18 21:05:19

标签: perl

这里我试图首先将数组加入到字符串中,然后再将其拆分 但是第四根弦“四五”也是分开的。我该如何处理?我正在使用
' - '作为分隔符

$constring = joinstring("One","Two","Three","four-five");
print "$constring\n";

@original=sepstring($constring);
#print "@original\n";

sub joinstring {
   my @names = @_;
   my $size  = @names;
   my $delim = "-";
   my $repdelim = "--";

   my $temp  = $names[0];
   my $temp2;

   for ( $a = 1; $a < $size; $a = $a + 1 ) {
       $temp2 = $names[$a];
       $temp2 =~ s/$delim/$repdelim/;   
       $temp  = "$temp$delim$temp2";
   }
   return "$temp";
}

sub sepstring {
    my $delim1 = "-";
    my $stringpassed = @_[0]; 
    my @values2 = split($delim1, $stringpassed);
    print "@values2"
}

1 个答案:

答案 0 :(得分:3)

首先,请注意您的编码本质上不明确:"foo---bar"可能会解码为"foo-", "bar""foo", "-bar",或者可能(如果允许空元素),甚至"foo", "", "bar" 。因此,您真正需要的是更好的编码。

一个常见的解决方案是选择一些字符 other 而不是分隔符(-)作为转义序列介绍人。例如,Perl本身使用反斜杠(\)作为字符串文字中的转义字符。

当然,这意味着您需要转义两个分隔符转义字符本身。 例如,让我们保留-作为分隔符,然后选择+作为转义字符。

我们可以决定将-编码为+-,将文字+编码为++,但事实证明是使用正则表达式进行解析有点棘手,因为为了确定-字符是否实际转义,你需要检查它前面的+个符号的数量是否为奇数甚至。

如果被转义的字符永远不会出现在转义序列中,事情会变得容易得多。例如,让我们决定将文字-编码为+0,将文字+编码为+1。编码和解码例程看起来像这样:

sub join_strings {
    my @strings = @_;
    s/\+/\+1/g, s/\-/+0/g for @strings;
    return join "-", @strings;
}

sub split_string ($) {
    my @strings = split /\-/, shift;
    s/\+0/\-/g, s/\+1/+/g for @strings;
    return @strings;
}

(注意:需要s/\+中的反斜杠,因为+是正则表达式元字符.Stack Overflow的语法突出显示似乎也被序列/-/弄糊涂了,所以我添加了一些额外的反斜杠以保持快乐;这些并不是严格需要的。)

重要的是首先编码转义字符+并最后解码,否则会干扰其他的解码步骤。

请注意split_string函数接受任何输入字符串,即使join_strings永远不会生成它。如果需要,您可以检查输入是否包含任何未转义的+字符:

die "Invalid joined string \"$string\"" if $string =~ /\+(?![01])/;