可以使用字符類來表示一組可能匹配的單個字符。而字符類開始處的^
符號會否定該類,並說「除......之外的任何匹配項」。在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章中討論過。
perldoc -f split。 'split/[%,] /,..' –
完美工作!謝謝! – user2524169
@mpapec你爲什麼不發表你的評論作爲答案? –