将数组拆分为两个。预定的尺寸可能并不总是相等的

时间:2016-12-20 19:34:51

标签: arrays perl split

我需要遍历目录中的许多文件并将每个文件分成两部分。我需要保持线条完好无损(我不能在咬合大小上分开)。我也不能总是假设文件的行数相同。我可以使用" split"功能,但我正在寻找一种更快的方式来浏览我的文件,并避免标准的输出名称" xaa"和" xab"它会产生。

最简单的方法是以指定的大小($ number_of_group_one和$ number_of_group_two)生成数组的两个后续子串。我无法找到如何做到这一点。相反,我试图将线条推入不同的阵列 - 填充一个直到一定数量的线,然后"溢出"进入另一个阵列,直到没有剩余的线要推。但是,这种方法产生两个输出数组,它们都具有输入行数的两倍。这是我的代码:

#!/usr/bin/perl
use warnings;
use strict;

my ($directory) = @ARGV;
my $dir = "$directory";
my @arrayoffiles = glob "$dir/*";
my @arrayoflines_one;
my @arrayoflines_two;
my $counter = 0;

foreach my $filename(@arrayoffiles){
    my @arrayoflines_one;
    my @arrayoflines_two;
    my @lines = read_lines($filename);
    my $NumberofLines = @lines;
    my $number_of_group_one = int($NumberofLines/2);
    my $number_of_group_two = ($NumberofLines - $number_of_group_one);
    foreach my $line (@lines){
            $counter++;
            push (@arrayoflines_one, $line, "\n");
            if ($counter == $number_of_group_one){
                    push (@arrayoflines_two, $line, "\n");
            }
    }
}

sub read_lines {
    my ($file) = @_;
    open my $in, '<', $file or die $!;
    local $/ = undef; #slurps the whole file in as one
    my $content = <$in>;
    return split /\s/, $content;
    close $in;
}

我希望这很清楚。谢谢你的帮助!

1 个答案:

答案 0 :(得分:3)

这是splice的一个很好的用例:

 my @lines = read_lines($filename);
 my @lines1 = splice @lines, 0, @lines/2;

会将@lines中的大约一半行放入@lines1,从@lines删除它们(并留下大约一半的行)。