2014-06-16 55 views
0

我想分割這個字符串。下面的代碼:分割字符串中的兩個字符 - Perl

my $string = "585|487|314|1|1,651|365|302|1|1,585|487|314|1|1,651|365|302|1|1,656|432|289|1|1,136|206|327|1|1,585|487|314|1|1,651|365|302|1|1,585|487|314|1|1,651|365|302|1|1%656|432|289|1|1%136|206|327|1|1%654|404|411|1|1"; 
my @ids = split(",", $string); 

我要的是字符串中分割僅%,,有人告訴我,我可以用一個模式,這樣的事情? /[^a-zA-Z0-9_]/

+8

perldoc -f split。 'split/[%,] /,..' –

+0

完美工作!謝謝! – user2524169

+0

@mpapec你爲什麼不發表你的評論作爲答案? –

回答

3

可以使用字符類來表示一組可能匹配的單個字符。而字符類開始處的^符號會否定該類,並說「除......之外的任何匹配項」。在split的上下文中,無論哪種匹配都被視爲分隔符。 '[^ a-zA-Z0-9_]可以匹配除ASCII字母'a'到'z','A'到'Z'以及數字' 0'到'9',加上下劃線。在你的情況下,雖然這將正確地分割爲「,」和「%」(因爲它們不包含在az,AZ,0-9或_中),它也會錯誤地分割爲「|」,以及任何其他字符不包含在您嘗試的字符類中。

在你的情況下,更具體地說明要使用哪些分隔符,並且使用否定類來使用而不是;您要指定確切的分隔符而不是分隔符不能分隔的整個字符集。所以mpapec在他的評論中指出,更好的選擇是[%,]

所以您的解決方案應該是這樣的:

my @ids = split/[%,]/, $string; 

一旦你劈在「%」和「,」,你會帶着一幫子的看起來像這樣留給:585|487|314|1|1(或一些這些數字的變化)。在每種情況下,它是由'|'字符分隔的五個正整數。在我看來,你最終還是希望通過分裂'|'來打破這種情況。

您可以構建由列表列表表示的單個數據結構,其中每個頂級元素表示一個[,%]分隔字段,並且由對管道分隔字段組成的匿名數組的引用組成。下面的代碼將建立一個結構:

my @ids = map { [ split /\|/, $_ ] } split /[%,]/, $string; 

時運行,你最終會像這樣的東西:

@ids = ( 
    [ '585', '487', '314', '1', '1' ], 
    [ '651', '365', '302', '1', '1' ], 
    # ... 
); 

現在,一個ID中的每個字段可以進行檢查和單獨操作。

要了解更多關於字符類如何工作的內容,可以查看perlrequick,它對字符類有很好的介紹。有關split的更多信息,總是有perldoc -f split(如mpapec所述)。 split也在O'Reilly的書第6版Learning Perl的第9章中討論過。

+1

令人驚訝的詳細解釋,+1 :) – zx81