我正在尝试遍历一个列表,这些列表总是占据中间位置,然后将列表减半并反复执行此操作。
(还有更多的东西比这个,但我这样做是为了说明我的斗争)
#!/usr/bin/perl
use strict;
my @listylist;
my @list = (0..50);
push @listylist,\@list;
my @list2 = (0..100);
push @listylist,\@list2;
myfunc(\@listylist);
sub myfunc()
{
my ($listgroup) = @_;
my $f = <>;
my @newlistoflists;
foreach my $list (@$listgroup)
{
my $size = scalar @list;
my $half = int($size/2);
print "Size of Array -> {".$size."}\n";
my @left = grep {$_ < $half} @list;
$size = scalar @left;
print "Size of Halved Array -> {".$size."}\n";
push @newlistoflists, \@left;
}
myfunc(\@newlistoflists);
}
输出如下:
第一次迭代:
Size of Array -> {51}
Size of Halved Array -> {25}
Size of Array -> {51} "I am expecting to see 101"
Size of Halved Array -> {25} "I am expecting 50"
第二次迭代
Size of Array -> {51} "Should be 25 (half of 51)"
Size of Halved Array -> {25} "Should then be 12"
Size of Array -> {51} "Should be 51 (half of 101"
Size of Halved Array -> {25} "Should then be 25"
我认为它是foreach行中的指针语法,但我尝试的每个变体都会给出相同的结果或错误。
让我感到困惑的是为什么第二次迭代与第一次迭代相同。
提前谢谢你。
答案 0 :(得分:3)
将主代码放在子定义之后,或者至少将其包装在curlies中以限制其中声明的变量的范围。 (我这两个。)
#!/usr/bin/perl
use strict;
use warnings qw( all ); <-- You should always use this.
{ <-- Added this.
my @listylist;
my @list = (0..50);
push @listylist,\@list;
my @list2 = (0..100);
push @listylist,\@list2;
myfunc(\@listylist);
} <-- Added this.
sub myfunc()
{
my ($listgroup) = @_;
my $f = <>;
my @newlistoflists;
foreach my $list (@$listgroup)
{
my $size = scalar @list;
my $half = int($size/2);
print "Size of Array -> {".$size."}\n";
my @left = grep {$_ < $half} @list;
$size = scalar @left;
print "Size of Halved Array -> {".$size."}\n";
push @newlistoflists, \@left;
}
myfunc(\@newlistoflists);
}
perl
现在会发现您的错误。
main::myfunc() called too early to check prototype at a.pl line 10.
Global symbol "@list" requires explicit package name at a.pl line 20.
Global symbol "@list" requires explicit package name at a.pl line 23.
Execution of a.pl aborted due to compilation errors.
答案 1 :(得分:1)
您不清楚自己想要什么结果,因为您只关注每个子阵列的@left
侧
以下是您的代码的主要问题
您正在使用myfunc
的原型,该原型表示子程序不带参数。但是您首先编写了对该子例程的调用,因此原型被忽略。有了use warnings 'all'
,您就会看到
main :: myfunc()过早调用原型
使用@list
,这是在程序顶部定义的全局声明的数组。我认为你必须指的是解除引用的数组@$list
使用grep {$_ < $half} @list
,根据数组的内容进行过滤,而不是元素的索引。最初在数组@list
和@list2
中它们是相同的,但是只要将它们拆分一次,@list
的后半部分就会包含25到50,这与索引不同
您的递归没有退出。将数组大小减半会导致一个空数组仍然会传回子程序以进行更多处理
这就是我认为你打算写的东西。我已添加对Data::Dump
的调用,以显示在每个递归级别传递的参数
#!/usr/bin/perl
use strict;
use warnings 'all';
use Data::Dump;
my @listylist = ( [ 0 .. 50 ], [ 0 .. 100 ] );
myfunc(\@listylist);
sub myfunc {
my ($listgroup) = @_;
dd $listgroup;
my @newlistoflists;
for my $list (@$listgroup) {
my $size = scalar @$list;
print "Size of Array -> {$size}\n";
my $half = int($size/2);
my @left = @{$list}[0 .. $half-1];
$size = scalar @left;
print "Size of Halved Array -> {$size}\n";
push @newlistoflists, \@left if $size > 0;
}
myfunc(\@newlistoflists) if @newlistoflists;
}
[[0 .. 50], [0 .. 100]]
Size of Array -> {51}
Size of Halved Array -> {25}
Size of Array -> {101}
Size of Halved Array -> {50}
[[0 .. 24], [0 .. 49]]
Size of Array -> {25}
Size of Halved Array -> {12}
Size of Array -> {50}
Size of Halved Array -> {25}
[[0 .. 11], [0 .. 24]]
Size of Array -> {12}
Size of Halved Array -> {6}
Size of Array -> {25}
Size of Halved Array -> {12}
[[0 .. 5], [0 .. 11]]
Size of Array -> {6}
Size of Halved Array -> {3}
Size of Array -> {12}
Size of Halved Array -> {6}
[[0, 1, 2], [0 .. 5]]
Size of Array -> {3}
Size of Halved Array -> {1}
Size of Array -> {6}
Size of Halved Array -> {3}
[[0], [0, 1, 2]]
Size of Array -> {1}
Size of Halved Array -> {0}
Size of Array -> {3}
Size of Halved Array -> {1}
[[0]]
Size of Array -> {1}
Size of Halved Array -> {0}