我正在尝试每5个字符拆分一个字符串。我从split
回来的数组并不是我所期待的:所有偶数索引都是空的,我正在寻找的部分是奇数索引。
此版本不输出任何内容:
use warnings;
use strict;
my @ar = <DATA>;
foreach (@ar){
my @mkh = split (/(.{5})/,$_);
print $mkh[2];
}
__DATA__
aaaaabbbbbcccccdddddfffff
如果我将print
行替换为此(奇数索引1
和3
):
print $mkh[1],"\n", $mkh[3];
输出是前两部分:
aaaaa
bbbbb
我不明白这一点,我希望能用这个打印前两部分:
print $mkh[0],"\n", $mkh[1];
有人可以解释我的代码中有什么问题,并帮我修复它吗?
答案 0 :(得分:3)
split
中的第一个参数是要拆分的模式,即它描述了将字段分开的内容。如果您将捕获组放在那里(就像那样),那些将被添加到split
文档(最后一段)中指定的拆分输出中。
这不是你想要的 - 你的分隔符不是一组五个字符。您希望每隔X个字符拆分一个字符串。为此,更好地使用:
my @mkh = (/...../g);
# or
my @mkh = (/.{5}/g);
或您在How can I split a string into chunks of two characters each in Perl?
中找到的其他选项之一答案 1 :(得分:2)
要准确观察split
操作正在进行的操作,请使用Data::Dump
之类的模块:
use warnings;
use strict;
while (<DATA>) {
my @mkh = split /(.{5})/;
use Data::Dump;
dd @mkh;
}
__DATA__
aaaaabbbbbcccccdddddfffff
输出:
("", "aaaaa", "", "bbbbb", "", "ccccc", "", "ddddd", "", "fffff", "\n")
如您所见,您的代码正在拆分5个字符的组,并在它们之间留下空字符串。这显然不是你想要的。
相反,您只想捕获5个字符的组。因此,您只需要与/g Modifier进行模式匹配:
use warnings;
use strict;
while (<DATA>) {
my @mkh = /(.{5})/g;
use Data::Dump;
dd @mkh;
}
__DATA__
aaaaabbbbbcccccdddddfffff
输出:
("aaaaa", "bbbbb", "ccccc", "ddddd", "fffff")
答案 2 :(得分:1)
你也可以使用零宽度分隔符,可以在5个字符前面的位置描述分割字符串(通过使用\K
正面看后面)
my @mkh = split (/.{5}\K/, $_);