我不知道该怎么做。
我有一个文件(永远不会很大,所以不会需要一个模块)并希望将其分解,以便我可以在我的网页上每行显示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
有人可以帮忙吗?
答案 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
以下列出了您应该考虑的事项:
$行=&#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后端可能会更快)