我正在学习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;
问题是库中的函数只抓取数组的第一个数字,我不确定如何遍历数组。任何帮助表示赞赏。
贝克答案 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;
}
}