这里我尝试首先将数组连接成字符串,然后再次拆分它
但第四弦“四五”也分开了。我该如何处理这个问题?我正在使用
'-' 作为分隔符
$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/