2014-01-11 2 views
-1

Как я могу получить доступ к значениям массива @missing вне области действия, когда цикл завершен?Доступ к окончательному значению массива из области действия цикла

Я попытался объявить его вне сферы действия, но когда я печатаю из области действия, я не получаю никаких значений. Вот мой код:

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

Вы не пытаетесь получить доступ к массиву '@ missing' вне цикла. Вы хотите сохранить все разные элементы '@ missing' для каждой итерации? – TLP

+0

Кроме того, ваша ошибка не связана ни с чем в вашем коде. – TLP

ответ

0

Вы не пытаетесь получить доступ к @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, вы можете сохранить ссылку на него непосредственно. Каждая итерация выходит из области действия и инициализируется новым адресом памяти.

+0

это отвечает на мой вопрос отлично! после этого я сделал массив плоским, так как мне не нужно 2D. Спасибо :) –

+0

О, это то, что делает подпрограмма 'flat'? Если вам не нужен 2D-массив, просто возьмите массив вместо ссылки: 'push @all, @ missing' – TLP

+0

Да :) Это подпрограмма из списка CPAN :: Flatten; Спасибо, TLP. –

0

В настоящее время это петля моя переменная, которая имеет объем только в течение цикла.

Объявление @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; 
+0

Это может быть очень странно, я сделал это, и я даже просто добавил «отсутствующий» сброс, как вы это делали. Но последний недостающий текст по-прежнему пуст. Когда я запускаю скрипт, он заканчивается через некоторое время. –

+0

Убедитесь, что у вас больше нет 'my @ missing' внутри цикла for ... Вы можете распечатать Dumper вместо print STDOUT .... Кроме того, попробуйте выполнить печать @order перед циклом, если @order пуст, цикл ничего. – Paul

+0

Благодарю вас за помощь. Решение, предоставленное TLP, работало :), вы получили мой голос :) –

Смежные вопросы