繁体   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