在Perl中一次显示文本文件5行

时间:2015-04-28 20:25:59

标签: perl

我不知道该怎么做。

我有一个文件(永远不会很大,所以不会需要一个模块)并希望将其分解,以便我可以在我的网页上每行显示5行。

这是我所拥有的。

$row="5";
@DD=<DATA>;
foreach $line (@DD) {
$count++;
chomp($line);
 if ($count <= $row) {
 print qq~$line ~; # This shows5, but don't know what to do next.
 }
}
exit;


__DATA__
aaaa
bbbb
cccc
dddd
eeee
ffff
gggg
hhhh
iiii
jjjj
kkkk
llll
mmmm

预期结果(应该在3行,但你的论坛软件不会让我)

aaaa bbbb cccc dddd eeee
ffff gggg hhhh iiii jjjj
kkkk llll mmmm

有人可以帮忙吗?

4 个答案:

答案 0 :(得分:3)

您必须重置计数并在5处打印一个新行。

 print qq~$line~;
 if ( $count == $row ) { 
     print "\n";
     $count = 0;
 }
 else { 
     print ' ';
 }

然而,更容易的是模数:

use strict;
use warnings;
my $row   = 5;
my $count = 0;

foreach my $line ( <DATA> ) { 
    chomp( $line );
    print $line, ++$count % $row ? ' ' : "\n";
}

如果$count$row的倍数打印换行符,则打印空格。

答案 1 :(得分:1)

达到限制时(5)将计数器重置为0并打印换行符

$count = 0;
print "\n";

BTW您可以对代码进行一些改进,但最重要的是use strict and warnings

我认为这会奏效:

use strict;
use warnings;
my $rows = 5;
my $count = 0;
my @lines = <DATA>;
chomp @lines;
foreach my $line (@lines) {
    $count++;
    if ($count <= $rows) {
        print qq{$line };
    } else {
        $count = 0;
        print "\n";
    }
}

答案 2 :(得分:1)

您的代码存在许多问题。请参阅下面的评论。

#!/usr/bin/env perl

use strict;
use warnings;

my $threshold = 5;

my @buffer;
while (my $line = <DATA>) {
    $line =~ s/\s\z//;
    push @buffer, $line;
    if (@buffer % $threshold == 0) {
        print join(' ', @buffer), "\n";
        @buffer = ();
    }
}

@buffer
    and print join(' ', @buffer), "\n";

__DATA__
aaaa
bbbb
cccc
dddd
eeee
ffff
gggg
hhhh
iiii
jjjj
kkkk
llll
mmmm

以下列出了您应该考虑的事项:

首先,您应该使用strictwarnings

  

$行=&#34; 5&#34 ;;

$row旨在用作数字变量。为什么要给它分配一个字符串?

@DD=<DATA>;
foreach $line (@DD) {

无需通过诽谤所有内容来创建额外的数组__DATA__部分。相反,请使用while并逐行阅读。

$count++;

Perl的内置$.计算读取的行数。无需额外的变量。

对于多样性:如果你坚持啜饮,你可以啜饮成一串:

#!/usr/bin/env perl

use strict;
use warnings;

my $threshold = 5;
my $contents = do { local $/; <DATA> };

while ($contents) {
    ($contents, my @fields) = reverse split(qr{\n}, $contents, $threshold + 1);
    print join(' ', reverse @fields), "\n";
}

或继续悄悄进入数组并使用splice

#!/usr/bin/env perl

use strict;
use warnings;

my $threshold = 5;
my @contents = <DATA>;

while (@contents) {
    print join(' ', map { chomp; $_ } splice @contents, 0, $threshold), "\n";
}

答案 3 :(得分:0)

# always start your Perl 5 files with these
# two pragmas until you know exactly why they
# are recommended
use strict;
use warnings;

my $row = 5;

while ( <> ){
    chomp;
    print;

    print $. % $row ? ' ' : "\n";
}

# makes sure there is always a trailing newline
print "\n" if $. % $row;
$ time ./example.pl /usr/share/dict/words

...

real    0m2.217s
user    0m0.097s
sys     0m0.084s

在Perl 6中,我可能会把它写成:

'filename'.IO.lines.rotor(5, :partial).map: *.say;

(目前在Moar后端处理/usr/share/dict/words大约需要15秒,但它没有像Perl 5那样对其应用20年的优化。使用JVM后端可能会更快)