2013-06-12 6 views
1

Использование Data::Dumper и List::Util Я могу суммировать общее количество каждой строки в моем массиве с помощью подпрограммы. Эта часть верна.Подпрограмма подпрограммы Perl

С более легким подходом я попытался напечатать общее количество всех номеров с помощью отдельной подпрограммы, которая называется get_grandtotal. Это возвращает неправильные номера.

Мой вопрос: как напечатать правильную сумму?

И какие модификации я буду использовать для печати общей суммы столбца (вместо общей суммы), используя аналогичную структуру в get_row(@values).

#!/usr/bin/perl 
use 5.10.1; 
use warnings; 
use strict; 

use List::Util qw(sum); 
use Data::Dumper; 

my @values = ( 
    [ 6, 5, 13 ], 
    [ 35, 9, 6 ], 
    [ 65, 255, 54 ] 
); 

get_row(@values); 

sub get_row { 
    my @total; 
    foreach my $row (@_) { 
     say join ' ', @$row; 
     push @total, sum @$row; 
    }  
    say Data::Dumper->Dump([ \@total ], [ qw(*Row_Total) ]); 
} 

my $sum = 0; 
sub get_grandtotal() {  
    foreach (@values) { 
     $sum += $_; 
    } 
    print "Grand Total = $sum\n"; 
} 

get_grandtotal(); 

Выход

6 5 13 
35 9 6 
65 255 54 
@Row_Total = (
       '24', 
       '50', 
       '374' 
      ); 

Grand Total = 61899232 
+0

некоторые заметки в стиле: вы объявляете get_grandtotal с прототипом; это мало используется и может ввести в заблуждение, так что нет. Однако передайте @values ​​для get_grandtotal и loop over @_. – ysth

+0

тривиально, '$ sum = sum map @ $ _, @ values' – ysth

ответ

2

Вы пытаетесь добавить вместе массивы ссылок в

$sum += $_; 

изменения это

$sum += sum @$_; 

и ваш код будет работать.

Эта подпрограмма использует map извлечь столбцы из массива и выводит итоговые

sub get_column { 

    my @total; 
    foreach my $i (0 .. $#{$values[0]}) { 
     my @column = map $_->[$i], @values; 
     say join ' ', @column; 
     push @total, sum @column; 
    }  

    say Data::Dumper->Dump([ \@total], [ qw(*Column_Total) ]); 
} 

выход

6 35 65 
5 9 255 
13 6 54 
@Column_Total = (
        '106', 
        '269', 
        '73' 
       ); 
Смежные вопросы