[英]Splitting Two Characters In a String - 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_]/
字符類可用於表示一組可能匹配的單個字符。 字符類開頭的^
符號使該類取反,說“除...以外的任何其他匹配項”。在split
的上下文中,任何匹配項都視為定界符。
在這種情況下,“ [^ a-zA-Z0-9_]”將匹配除ASCII字母“ a”至“ z”,“ A”至“ Z”以及數字數字“ 0”至“ 9',再加上下划線。 在您的情況下,盡管這會正確地分割為“,”和“%”(因為它們未包含在z,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所述 )。 O'Reilly的書《 Learning Perl,第6版》第9章中也討論了split
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.