2009-11-11 29 views
2

,如果我有一个字符串,说:在Perl中,如何将这个CSV字符串中的字段放入一个不带空格的数组中?

my $string = "A, B,C, D , E "; 

我怎样才能投入Perl中的数组这个没有开头和结尾的空格?所以我想要的只是每个数组元素中的单个字母。我目前做的是这样的:

my @groups = split /,\s*/, $string; 

但是,这显然是不够的,因为尾随空格仍然存在。任何帮助赞赏。非常感谢 !!

回答

7

然后剥去前/后间隔拆分之前和匹配在分裂表达的前/后间隔。

my $string = " A, B,C, D , E "; 
$string =~ s/^\s+//; 
$string =~ s/\s+$//; 
my @groups = split /\s*,\s*/, $string; 

使用像Text::CSV一个模块可能比试图做自己的CSV解析更好,虽然。

+0

讨厌鬼。打败我吧。 :-) – BlairHippo 2009-11-11 20:53:13

+0

那个常见问题讨论了修剪前/后空白,所以我不确定你想提请注意什么。 – jamessan 2009-11-11 21:08:03

+1

除非你的输入是保证这个简单,谁一直带领你走向文本的乡亲:: CSV是正确的:你不希望自己解析它。如果数据中嵌入了任何逗号,这个简单的拆分语句将会分解它不应该的字段。 – BlairHippo 2009-11-11 21:09:20

2

在这里你去:

@groups = split /,/, $string; 
#remove whitespace now. 
@groups = map { s/^\s+//; s/\s+$//; $_ } @groups; 

注:正则表达式可以简化我敢肯定,只是还没有制定出来呢。

+0

你真是太神奇了!这工作真的很好!非常感谢您的帮助! – Juan 2009-11-11 21:03:10

+0

// ///将转换@groups中的元素,因此这是无用的地图使用。你可以做:s/^ \ s + //,s/\ s + $ // for @groups; 或者在Algorithm :: Loops中使用Filter。 – runrig 2009-11-12 00:11:37

5
my @groups = map { s!^\s+!!; s!\s+$!!; $_ } split /,/, $string; 

my @groups = $string =~ /([A-Z])/g; 

然而,除非输入是真的那么简单,你已经证明,你会使用Text::CSVText::xSV会更好。

+0

你为什么使用!作为q {}分隔符,出于好奇? – 2009-11-11 20:58:41

+2

@保罗森:因为我变得非常恼火,SO治疗后''//'中的S/\ s + $ //'作为注释字符并且灰线的其余部分。 – 2009-11-11 21:01:14

+0

@Sinan:有道理!它也使我烦恼。 – 2009-11-11 21:02:39

1

只是为了确保我不是失去了一些东西,试图揭穿你的例子后,我想出了这个:

my $string = " A, B,C, D , E "; 
$string =~ s/\s+//g; 
my @groups = split /,/, $string; 

会工作,要么我猜?

+2

这会删除所有空格,而不是逗号周围的空白以及行首或行尾。例如,如果您有$ string =“Bob Jones,George Jetson,Foo Bar”,那么您的代码也会剥去单词之间的空格。 – jamessan 2009-11-11 21:13:08

2

你不必限制自己split,你只需要使用一个与之相匹配的/g修改。

my $string = " A, B,C, D , E "; 
my @groups = $string =~ /\s*([^,]+?)\s*,?/g; 
相关问题