2

这是我在这个论坛的第一篇文章。我在拆分以下字符串时遇到问题。

文件中带有前导空格、中间多个空格和管道符号的字符串:

$str= | U-mom  |   9.2 |   2.30E-04 | 9.60E-04 |    1.04E-04  OK |;

我无法在上面显示的字符串中放置多个空格,但后面有多个空格"U-mom"

  1. 我尝试使用以下方法拆分它:$str = join "", split ' ', $str;

    结果:|U-mom|9.2|2.30E-4|9.60E-4|1.04E-04OK|

  2. 接下来我使用:split(/\|/,$str); 将每个字符串存储在数组中,结果是:


0      
U-mom0  
9.20  
2.30E-040  
9.60E-040  
1.04E-04OK0

结果输出 0 作为起始数组,0 作为数组每个元素的后缀。需要帮助来克服这个问题。

4

3 回答 3

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]'";
}
于 2013-11-14T16:27:28.120 回答
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*匹配零个或多个空白字符

于 2013-11-14T15:55:29.940 回答
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
于 2013-11-14T16:10:56.203 回答