我有一个程序可以在行中打印数组的内容。我希望它能将每个数组打印在一个彼此相邻的列中。
这是代码:
#!/usr/local/bin/perl
use strict;
use warnings;
my @M_array;
my @F_array;
open (my $input, "<", 'ssbn1898.txt');
while ( <$input> ) {
chomp;
my ( $name, $id ) = split ( /,/ );
if ( $id eq "M" ) {
push ( @M_array, $name );
}
else {
push ( @F_array, $name );
}
}
close ( $input );
print "M: @M_array \n";
print "F: @F_array \n";
这可能还是我想做一些无法做到的事情?
所需格式:
M F
Namem1 Namef1
Namem2 Namef2
答案 0 :(得分:3)
您可以使用join
函数在数据之间添加您想要的任何分隔符,下面的示例格式化数组中由制表符分隔的数据:
...
use List::MoreUtils qw/pairwise/;
my $separator = "\t";
print join($separator, qw(M F)), "\n";
print join(
"\n",
pairwise { ( $a // '') . $separator . ( $b // '') } @M_array, @F_array
), "\n";
...
答案 1 :(得分:2)
我认为,你应该使用Perl格式。看看Perl documentation。您可能希望在案例中使用@*
格式字段。
我扩展了你的代码,以便在最后打印所需的输出
use strict;
use warnings;
my @M_array;
my @F_array;
open (my $input, "<", 'ssbn1898.txt');
while ( <$input> ) {
chomp;
my ( $name, $id ) = split ( /,/ );
if ( $id eq "M" ) {
push ( @M_array, $name );
}
else {
push ( @F_array, $name );
}
}
close ( $input );
unshift @M_array, 'M';
unshift @F_array, 'F';
my $namem;
my $namef;
my $max = 0;
$max = (length($_) gt $max ? length($_) : $max) for @M_array;
my $w = '@' . '<' x $max;
eval "
format STDOUT =
$w @*
\$namem, \$namef
.
";
while ( @M_array or @F_array) {
$namem = shift @M_array || '';
$namef = shift @F_array || '';
write;
}
答案 2 :(得分:1)
join
可能是最简单的方法,tabs
可以很好地对齐您的列。
join ( "\t", @array ),
或者,perl允许通过(s)printf进行格式化:
printf ( "%-10s %-10s", "first", "second" );
或更详细的'format'
考虑到你要做的是将两个数组放入列中:
#!/usr/local/bin/perl
use strict;
use warnings;
my $format = "%-10s\t%-10s\n";
my @M_array = qw ( M1 M2 M3 M4 M5 );
my @F_array = qw ( F1 F2 F3 );
my $maxrows = $#M_array > $#F_array ? $#M_array : $#F_array;
printf ( $format, "M", "F" );
for my $rownum ( 0..$maxrows ) {
printf ( $format, $M_array[$rownum] // '', $F_array[$rownum] // '' );
}
这将打印标题行,然后循环遍历您一次打印一行的数组。 //
是一个条件操作,用于测试是否定义了某些内容。虽然*它只适用于较新的perls。在较旧的版本中,||
可以解决问题 - 它的几乎相同,但处理''
和0
的方式略有不同。
* Perl 5.10以后,所以非常安全,但值得一提,因为有些系统仍在使用perl 5.8。
答案 3 :(得分:1)
您可以使用sprintf函数格式化输出,但还有一些问题需要解决:如果数组的条目数不同,该怎么办?为此,你需要一个占位符。列中必须包含多少字母?应该如何对齐?一些代码用于说明:
#!/usr/bin/perl
use strict;
use warnings;
my @m = (1, 2, 3);
my @f = (11, 22, 33, 44);
# calculate how many rows to display
my $max = @m;
if (@m < @f) {
$max = @f;
}
# placeholder for missing data
my $none = '-';
# formatting 20 chars per column, left aligned
my $fmt = "%-20s%-20s\n";
# print header
print sprintf($fmt, "M", "F");
# print data rows
foreach my $i (0..$max-1) {
print sprintf($fmt, ($m[$i] or $none), ($f[$i] or $none));
}
如果您对更复杂的格式(例如中心对齐的文本)感兴趣,则应切换到special formatting capabilities Perl提供的报告生成。
答案 4 :(得分:1)
借用@HunterMcMillen
use strict;
use warnings;
use feature "say";
local $, = "\t"; # separator when printing list
my $i = (@F_array > @M_array) ? $#F_array : $#M_array;
say qw(M F);
say $M_array[$i] //"", $F_array[$i] //"" for 0 .. $i;
答案 5 :(得分:0)
我猜Text :: Table是perl发行版附带的必需模块(只需要安装)。通过以下文档 -
您需要将内容作为数组传递给add()方法,它将为您创造奇迹。