групповой список номеров - PullRequest
0 голосов
/ 24 февраля 2011

У меня есть список чисел в файле в одном столбце, например -

144

542

123

54

234

233

Я хочу группировать номера каждый раз Например: если n = 2, то 144 542 в одной группе, 123,54 во второй, 234 233 в третьей до конца файла
цикл, который я написал, дает мне первую группу чисел, а не весь список: Какие изменения я должен сделать?

use strict;
open ( IN ,"$inputfile") || die ("cannot open ! ");
my @list;
my $N=2;
while (@list = <IN>) {
chomp;
for ( $i=1;$i<=$N;$i++){
print "@list[$i]";
}
}

Ответы [ 3 ]

3 голосов
/ 24 февраля 2011

Использование natatime из Список :: MoreUtils

use warnings;
use strict;
use List::MoreUtils qw(natatime);

my $n = 2;

my @list;
while (<DATA>) {
    chomp;
    push @list, $_;
}

my $it = natatime($n, @list);
while (my @vals = $it->()) {
    print "@vals\n";
}

__DATA__
144
542
123
54
234
233

Печать:

144 542
123 54
234 233
2 голосов
/ 24 февраля 2011

Вы можете использовать функцию by из List :: Gen для разделения списка на сегменты равного размера:

use List::Gen qw(by);

my $pairs = by 2 =>                       # partition by 2
            grep {s/^\s+|\s+$//g; length} # remove whitespace and empty lines
            <DATA>;                       # read all lines

print "@$_\n" for @$pairs;

__DATA__
    144

    542

    123

    54

    234

    233

который печатает:

144 542
123 54
234 233
1 голос
/ 24 февраля 2011

Я приветствую ваше использование строгих правил и хотел бы призвать вас также добавлять предупреждения. :)

И решение, которое делает семантику более понятной:

use strict;
use warnings;

use File::Slurp 'read_file';
use Array::Split qw( split_by );

my $inputfile = 'file';
my @lines = read_file( "$inputfile" );
$_ =~ s/[\r\n]//g for @lines; # remove newlines

my @grouped_lines = split_by( 2, @lines );

for my $group ( @grouped_lines ) {
    print join ',', @{$group};
    print "\n";
}

__END__

144
542
123
54
234
233

becomes:

144,542
123,54
234,233
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...