簡體   English   中英

在字符串中分割兩個字符-Perl

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM