Perl格式化数组输出。

时间:2016-11-02 05:38:18

标签: arrays perl format

我有一个小程序,我正在尝试格式化输出。 结果被加载到一个数组中 - 我只是遇到了格式化问题 将数组打印成某种格式。

#!/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,

4 个答案:

答案 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{$_}";
}