我有一个小程序,我正在尝试格式化输出。 结果被加载到一个数组中 - 我只是遇到了格式化问题 将数组打印成某种格式。
#!/usr/bin/perl
use strict ;
use warnings ;
my @first_array ;
my @second_array ;
my @cartesian ;
while (<>) {
my $first_input = $_ ;
@first_array = split(' ', $first_input) ;
last ;
}
while (<>) {
my $second_input = $_ ;
@second_array = split(' ', $second_input) ;
last ;
}
while(my $first=shift(@first_array)) {
push(@cartesian, $first) ;
my $second = shift(@second_array) ;
push(@cartesian, $second ) ;
}
print "This is the merged array: @cartesian\n" ;
当我输入时,我明白了:
$ ./double_while2.pl
1 2 3
mon tue wed
This is the merged array 1 mon 2 tue 3 wed
我想要打印的是:
"1", "mon",
"2", "tue" ,
"3", "wed",
或者:
1 => "mon",
2 => "tue",
3 => "wed,
答案 0 :(得分:4)
我可以建议哈希,因为你正在配对
my %cartesian;
@cartesian{ @first_array } = @second_array;
print "$_ => $cartesian{$_}\n" for sort keys %cartesian;
上面使用哈希切片。见Slices in perldata
您构建的阵列最好配对,否则会出错。
如果目标是构建一个将元素配对的数据结构,那么可以直接完成,而不需要数组。更多信息将有助于对此发表评论。
答案 1 :(得分:2)
尝试使用哈希代替。
for my $i(0..$#first_array){
$hash{$first_array[$i]} = $second_array[$i];
}
或者,你想要不使用哈希的格式,请尝试如下
for (my $i = 0; $i < $#cartesion/2; $i++) {
my $j = ($cartesion/2) + $i;
print "$cartesion[$i] $cartesion[$j] \n";
}
答案 2 :(得分:0)
从你的问题和你的代码中,我认为你是一个可爱的新“受害者”perl~ 要合并两个具有相同长度的数组,我使用'map'来简化你的代码:
my @cartesian = map {$first_array[$_], $second_array[$_]} 0..$#first_array;
要格式化打印样式,您可以定义子程序以满足不同的要求:
sub format_my_array{
my $array_ref = shift;
my $sep = shift;
print $array_ref->[$_],$sep,$array_ref->[$_+1],"\n" for grep {! ($_%2)} 0..$#$array_ref;
}
现在,您可以尝试调用子例程:
format_my_array(\@cartesian, " => ");
或
format_my_array(\@cartesian, " , ");
现在,你得到你想要的东西〜
您可能已经注意到在这个答案中使用了一些中间概念,请不要这样,这正是我试图向您介绍的内容〜
祝你学习perl很开心〜
答案 3 :(得分:0)
诀窍是利用Perl的优势而不是与他们作斗争:
#!/usr/bin/perl
use strict;
use warnings;
# For say()
use 5.010;
my @first_array = split ' ', <>;
my @second_array = split ' ', <>;
if (@first_array != @second_array) {
die "Arrays must be the same length\n";
}
my @cartesian = map { $first_array[$_], $second_array[$_] } 0 .. $#first_array;
for (0 .. $#cartesian / 2) {
say "$cartesian[$_*2] => $cartesian[$_*2+1]";
}
但是,如果您为合并数据使用哈希而不是数组,它会变得更加容易。
#!/usr/bin/perl
use strict;
use warnings;
# For say()
use 5.010;
my @first_array = split ' ', <>;
my @second_array = split ' ', <>;
if (@first_array != @second_array) {
die "Arrays must be the same length\n";
}
my %cartesian;
@cartesian{@first_array} = @second_array;
for (sort keys %cartesian) {
say "$_ => $cartesian{$_}";
}