Perl 访问数组超出循环作用域的最终值

Perl 访问数组超出循环作用域的最终值,perl,Perl,循环完成后,如何访问范围外的@缺少的数组值 我试图将它声明在范围之外,但当我打印出范围之外时,我并没有得到任何值。 这是我的代码: my $last= $order[0]; for my $cur ( @order[1..$#order] ) { . . . my @missing = grep { ! $b{$_} } @aa; print Dumper @missing; $last = $cur; } 目前,它是一个循环my变量,其作用域仅在f

循环完成后,如何访问范围外的@缺少的数组值

我试图将它声明在范围之外,但当我打印出范围之外时,我并没有得到任何值。 这是我的代码:

my $last= $order[0];
for my $cur ( @order[1..$#order] ) {
   .
   .
   .
   my @missing = grep { ! $b{$_} } @aa;
   print Dumper @missing;
   $last = $cur; 
}   

目前,它是一个循环my变量,其作用域仅在for循环中

如果要在包含循环的作用域中访问它,请在循环之前声明@missing

my $last= $order[0];
my @missing = ();
for my $cur ( @order[1..$#order] ) {
   my @aa= flat $last;
   my @bb= flat $cur;
   my %b = map { $_ => 1 } @bb;
   @missing = ();  # reset from last use
   @missing = grep { ! $b{$_} } @aa;
   print Dumper @missing;
   $last = $cur; 
}   

print STDOUT "Final missing: ",@missing;

您没有试图访问代码中的
@missing
数组,因此我对您的确切意思有点困惑。但我假设您希望为每个迭代存储
@missing
中的不同元素。那么,就这样做吧

my @all_missing;
for .... {
    ...
    my @missing = grep { ! $b{$_} } @aa;
    push @all_missing, \@missing;            # store ref to array
}

# all the "missing" elements are now stored in the two-dimensional array
# @all_missing

因为您使用的是词汇变量
@missing
,所以可以直接存储对它的引用。每次迭代它都会超出范围并初始化为一个新的内存地址。

这可能非常奇怪,我这样做了,我甚至像你那样添加了“缺失”重置。但最后的打印仍然是空的。当我运行脚本时,它会在一段时间后结束。请确保for循环中不再有
my@missing
。。。您可以打印转储程序而不是打印标准输出。。。。此外,请尝试在循环之前打印@order,如果@order为空,则循环将不起任何作用。谢谢您的帮助。TLP提供的解决方案有效:)您得到了我的投票:)您没有尝试访问循环外的
@missing
数组。是否要为每次迭代保存
@missing
的所有不同元素?此外,您的错误与代码中的任何内容都无关。这完美地回答了我的问题!在那之后,我使阵列平坦,因为我不需要2D。谢谢:)噢,这就是
平面
子例程的功能吗?如果您不想要2D数组,只需获取数组,而不是引用:
push@all,@missing
Yes:)这是CPAN列表::flatte中的例程;谢谢你,TLP。