我需要遍历目录中的许多文件并将每个文件分成两部分。我需要保持线条完好无损(我不能在咬合大小上分开)。我也不能总是假设文件的行数相同。我可以使用" 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;
}
我希望这很清楚。谢谢你的帮助!
答案 0 :(得分:3)
这是splice
的一个很好的用例:
my @lines = read_lines($filename);
my @lines1 = splice @lines, 0, @lines/2;
会将@lines
中的大约一半行放入@lines1
,从@lines
删除它们(并留下大约一半的行)。