2016-11-02 3 views
1

У меня есть небольшая программа, которую я пытаюсь отформатировать. Результаты загружаются в массив - у меня просто возникают проблемы с формированием печати массива в определенном формате.Perl форматирование выходного массива.

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

Совет: 'while (<>) {my $ first_input = $ _; ... последний ; } '- это странный способ выполнения' my $ first_input = <>; ... ' – ikegami

+0

спасибо ikegami - вы мужчина – capser

ответ

2

Try вместо этого использовать хэш.

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"; 

    } 
4

Могу ли я предложить хеш, так как вы подключаете вещи

my %cartesian; 
@cartesian{ @first_array } = @second_array; 

print "$_ => $cartesian{$_}\n" for sort keys %cartesian; 

хэш ломтика используется выше. См. Slices in perldata

Массивы, которые вы построили, лучше сочетать вправо, или будут ошибки.

Если целью является построение структуры данных, которая объединяет элементы, которые, возможно, могут быть выполнены напрямую, без массивов. Дополнительная информация поможет прокомментировать это.

0

Из вашего вопроса и вашего кода, я полагаю, что вы прекрасная новая «жертва» на PERL ~ Чтобы объединить два массива с одинаковым Lengh, я suggeest с помощью «карт», чтобы упростить код:

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, " , "); 

Теперь, вы получите то, что вы хотите ~

Вы, возможно, заметили, что некоторые промежуточные понятия используются в этом ответе, не doute, что это именно то, что я пытаюсь чтобы представить Вам ~

мая вы большое счастье в изучении PERL ~

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