这是我在这个论坛上的第一篇文章。我在分割下面的字符串时遇到了问题。
带有前导空格的文件中的字符串,中间有多个空格和管道符号:
$str= | U-mom | 9.2 | 2.30E-04 | 9.60E-04 | 1.04E-04 OK |;
我无法在上面显示的字符串中放置多个空格,但在"U-mom"
之后有多个空格
我尝试使用:$str = join "", split ' ', $str;
结果:|U-mom|9.2|2.30E-4|9.60E-4|1.04E-04OK|
接下来我使用了:split(/\|/,$str);
将每个字符串存储在数组中,结果为:
0
U-mom0
9.20
2.30E-040
9.60E-040
1.04E-04OK0
结果输出0作为起始数组,0作为后缀出现在数组的每个元素中。 需要帮助来克服这个问题。
答案 0 :(得分:1)
请记住,split
的第一个参数是正则表达式而不是字符串。 (或者,它应该是正则表达式)。你可以这样做:
my @values = split /\s+\|\s+/, "$string";
请注意,这会使$values[0]
成为空字符串,因为在字符串的开头有一个|
空格。如果不存在这些空格,$values[0]
将为| U-mom
。另请注意,最后一个条目将以|
结尾,因为在上一个|
之后没有空格。如果有空格,你的最后一个条目实际上是正确的。
解决这个问题的一种方法是有目的地在字符串之前和之后放置空格:
my @values = split /\s+\|\s+/, " $string ";
splice (@values, 0, 1); # Removes that first blank entry;
现在,我们可以打印出来:
for my $entry (@values) {
say "$entry";
}
或者...
for my $index (0..$#values) {
say "Index: $index Entry: '$values[$index]'";
}
答案 1 :(得分:0)
split函数接受正则表达式。如果您知道将有前导空格和尾随空格,只需将其构建到正则表达式中即可进行拆分。
my $str = "| U-mom | 9.2 | 2.30E-04 | 9.60E-04 | 1.04E-04 OK |";
print "$_\n" for split(/\s*\|\s*/, $str);
# output:
# U-mom
# 9.2
# 2.30E-04
# 9.60E-04
# 1.04E-04 OK
\s*
匹配零个或多个空格字符
答案 2 :(得分:0)
你的第二次尝试应该有效,除了没有抓住空格:
perl -e 'print join("\n",split(/\s+\|\s+/," | U-mom | 9.2 | 2.30E-04 | 9.60E-04 | 1.04E-04"))'
U-mom
9.2
2.30E-04
9.60E-04
1.04E-04