Perl与前导和尾随分隔符分开

时间:2013-11-14 15:47:50

标签: perl

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

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

$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); 将每个字符串存储在数组中,结果为:


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

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

3 个答案:

答案 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