Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Perl中迭代数组_Perl - Fatal编程技术网

在Perl中迭代数组

在Perl中迭代数组,perl,Perl,我正在学习Perl教程,对于如何在调用库时迭代数组有些困惑 库应该包含一个函数,该函数接受任意大小的数字数组。然后,该函数将计算数字的平均值、所有加在一起的数字的总和,以及一个新的数字数组,该数组由每个原始输入数字除以2组成。然后它将返回一个包含所有这些信息的新列表 脚本文件应该通过STDIN从用户那里获得一个数字列表,调用库函数并打印返回的数字 到目前为止,我在主脚本中有以下内容: #!/usr/local/bin/perl require 'test4lib.pl'; my

我正在学习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";
问题是库中的函数只获取数组的第一个数字,我不确定如何遍历数组。谢谢你的帮助


Becky

正如我在评论中解释的那样,您的代码还有其他问题,但我还是要回答您的问题,即如何将数组正确地传递到子例程中

只要您只想传递一个数组,您使用数组作为参数并直接访问@u的方法实际上是可行的:

use strict;
use warnings;

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

foo(@array);

sub foo
{
    foreach my $num (@_)
    {
        print "$num\n";
    }
}
然而,这里实际发生的是,您的数组被转换为一个列表并被传递,而该列表的内容存储在@中。如果你想传递两个长度未知的数组,需要在sub中进行区分,那么这很快就会成为一个问题,因为它们的所有元素都将在@uuz中相互跟随

向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]}并对其进行更改,这些更改也会显示在子对象之外的@数组中。当然,在许多情况下,这正是您想要的。比较:

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

欢迎来到stackoverflow。perl的标准建议是使用strict;使用警告;这有很多错误。您迭代所有传递的数字,将当前数字传递到$number中,但从不使用该变量,然后尝试计算该循环中所有数字的$total,但为此,您使用了一个名为$sum的东西,您从未设置它,当您仍在循环中时,您为每个数字计算$average两次,依此类推。。。在重写sub之前,您需要后退一步,考虑sub的流程。是的,在真正了解自己的工作之前,千万不要在没有严格警告的情况下编写perl脚本。我想说的是,即使这样也不行,但那就是我。请不要鼓励人们使用“&”调用子程序。它已经二十年没有必要了,而且可能会产生令人困惑的副作用。我不明白你说的不发出警告是什么意思。在任何情况下,foo都不会发出警告,但&foo不会在调用子例程时,它只是不必要的,所以它变成了毫无意义的标点符号,这让以前没有见过它的程序员感到困惑。原型与此无关。大多数子例程不应该有原型。潜在的令人困惑的副作用是调用&foo,在大多数人看来,这与&foo没有太大区别,Perl将当前值@u传递给foo,而不是空数组。哦。我看到你删除了我刚才回复的评论,b删除了符号。谢谢。@DaveCross有很多事情是不必要的。我承认,在这种情况下,没有空的原型和符号,代码更干净,覆盖了它。回答您对我删除的答案的回答这可能是一个好主意^^:符号和禁止原型检查。所以这一切都与原型有关。同样,它也会抑制原型检查警告,例如,缺少前向声明会产生警告。然而,是的,在这种情况下,没有理由使用原型,也没有理由使用符号,因此我删除了我的评论^^哦,我知道&抑制原型检查。但是如果您使用的是原型,那么就不应该抑制它们。如果你没有使用它们,就没有必要抑制它们。简而言之,我想不出在什么情况下使用符号是必要的,或者导致代码更干净。请参阅我的评论,以更详细地阐述我对该主题的想法,我应该在某个时候将其转化为博客文章。
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;
    }
}