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