这里我试图首先将数组加入到字符串中,然后再将其拆分
但是第四根弦“四五”也是分开的。我该如何处理?我正在使用
' - '作为分隔符
$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"
}
答案 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])/;