【问题标题】:Perl subroutine assistancePerl 子程序帮助
【发布时间】:2013-06-12 13:33:07
【问题描述】:

使用Data::DumperList::Util 我可以用一个子程序对数组中每一行的总和求和。这部分是正确的。

通过一种更简单的方法,我尝试使用名为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

【问题讨论】:

  • 一些风格说明:你正在用原型声明 get_grandtotal;这几乎没有用,可能会造成混淆,所以不要。不过,请务必将 @values 传递给 get_grandtotal 并遍历 @_。
  • 简单地说,$sum = sum map @$_, @values

标签: perl multidimensional-array subroutine


【解决方案1】:

您正在尝试将数组引用添加在一起

$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'
                );

【讨论】:

    猜你喜欢
    • 2011-08-06
    • 1970-01-01
    • 2012-12-21
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多