2009-11-11 47 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; 
相關問題