Perl 字符串拆分和连接

标签 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"
}

最佳答案

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

常见的解决方案是选择除分隔符 (-) 之外的一些字符作为转义序列引导符。例如,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])/;

关于Perl 字符串拆分和连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20057883/

相关文章:

perl - 无法通过包 "new"定位对象方法 "IO::Socket::SSL"

perl - 如何让 perl Makefile.PL 在编译 XS 模块时使用给定的 C 编译器?

arrays - 为什么|| =不能用于数组?

Perl XML::LibXML:如何访问注释节点

python - 如何使用 perl 或 python 解析 xlsb

algorithm - 如何反转具有复杂值的散列?

perl - 使用 SOAP 和 Perl 调用带参数的函数

perl - 尝试通过 Perl 中的词法绑定(bind)本地化外部包变量

perl - 对于文件总和值中的每一行

perl - 如何使用 Devel::Cover 标记可发现的 `//` 条件?