为什么split会返回一个数组,每个第二个元素为空?

时间:2014-10-19 15:20:57

标签: perl split

我正在尝试每5个字符拆分一个字符串。我从split回来的数组并不是我所期待的:所有偶数索引都是空的,我正在寻找的部分是奇数索引。

此版本不输出任何内容:

use warnings;
use strict;
my @ar = <DATA>;
foreach (@ar){
    my @mkh = split (/(.{5})/,$_);
    print $mkh[2];
}
__DATA__
aaaaabbbbbcccccdddddfffff

如果我将print行替换为此(奇数索引13):

 print $mkh[1],"\n", $mkh[3];

输出是前两部分:

aaaaa
bbbbb

我不明白这一点,我希望能用这个打印前两部分:

print $mkh[0],"\n", $mkh[1];

有人可以解释我的代码中有什么问题,并帮我修复它吗?

3 个答案:

答案 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)

使用Data :: Dump

进行调试

要准确观察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/, $_);