迭代Perl中的数组

时间:2015-04-16 05:28:07

标签: perl

我正在学习Perl教程并且在调用库时如何迭代数组

库应该包含一个接收数字数组(任意大小)的函数。然后,该函数将计算数字的平均值,加在一起的所有数字的总和,以及由原始输入数字组成的新数字数组,每个数字除以2.然后将返回一个包含所有数字的新列表。那个信息。

脚本文件应该通过STDIN从用户获取一个数字列表,调用库函数并打印返回的数字。

到目前为止,我在主脚本中有这个:

  #!/usr/local/bin/perl

  require 'test4lib.pl';

  my @numbers;

  while (<>) {
      s/\s+\z//;
      last if $_ eq "";
      push @numbers, $_;
  }
  print "My Numbers are:  @numbers\n";
  number_crunch(@numbers);

  print "Total is: $total\n";
  print "Average is: $Average\n";
  print "Divided by 2 is: @divided_by\n";

这在库函数中:

  sub number_crunch {
    foreach $number(@_) {
      $total = $sum+=$_ for (@_);
      $count = $numelements=(@_);

      $Average = ($total / $count);
      print "Total is: $total\n";
      $Average = ($total / $count);
      print "Average is: $Average\n";

      @divided_by = ();
      foreach (@_) {
        $new_number = $_ / 2;
        push @divided_by, $new_number;
      }
    }
  }
  1;

问题是库中的函数只抓取数组的第一个数字,我不确定如何遍历数组。任何帮助表示赞赏。

贝克

1 个答案:

答案 0 :(得分:0)

正如我在评论中解释的那样,您的代码还有其他问题,但让我仍然回答您关于如何将数组正确传递到子程序的问题。

您只需将数组用作参数并直接访问@_的方式确实有效,只要您只想传递一个数组:

use strict;
use warnings;

my @array = (1, 2, 3);

foo(@array);

sub foo
{
    foreach my $num (@_)
    {
        print "$num\n";
    }
}

然而,这里实际发生的是你的数组被转换成一个列表并传递,并且该列表的内容存储在@_中。如果你想传递两个未知长度的数组,你需要在你的sub中区分它,因为它们的所有元素只会在@_中相互跟随。

将数组(或哈希或其他任何东西)传递给subs时更好的做法是使用引用:

use strict;
use warnings;

my @array = (1, 2, 3);

foo(\@array);

sub foo
{
    my @passedArray = @{$_[0]}; #Interpret the reference passed to us first as an array
    foreach my $num (@passedArray)
    {
        print "$num\n";
    }
}

在这种情况下,我将数组复制为sub中的第一个东西。我这样做是为了使它更具可读性,但它也有安全用途。由于这是通过引用传递的,如果您要直接处理@{$_[0]}并更改它,那么这些更改也会显示在子网之外的@array中。当然,在许多情况下,这正是人们想要的。比较:

use strict;
use warnings;

my @array = (1, 2, 3);

square(\@array);

foreach my $num (@array)
{
    print "$num\n";
}

sub square
{
    foreach my $num (@{$_[0]})
    {
        $num *= $num;
    }
}